为什么c / c ++浮点类型如此奇怪地命名?

C ++提供三种浮点类型:float,double和long double。 我很少在代码中使用浮点数,但是当我这样做时,我总是被无害线条上的警告所吸引

float PiForSquares = 4.0;

问题是,文字4.0是一个双重的,而不是一个浮动 - 这是令人生气的。

对于整数类型,我们有短整型,整型和长整型,这很简单。 为什么不C只有短浮动,浮动和长浮动? 而在地球上“双”来自哪里?

编辑:它似乎浮动类型之间的关系类似于整数。 双倍必须至少与浮动一样大,而长双倍至少与双倍一样大。 没有其他的精度/范围保证。


术语“单精度”和“双精度” 起源于FORTRAN ,当C发明时已经被广泛使用。 在二十世纪七十年代早期的机器上, 单精度显着提高了效率,并且像今天一样,使用了双精度内存的一半。 因此这是浮点数的合理默认值。

当IEEE标准为英特尔80287浮点芯片提供了许可时, 很久以后增加了 long double ,后者使用80位浮点数而不是传统的64位双精度。

提问者对保证不正确; 今天几乎所有语言都保证以单精度(32位)和双精度(64位) 实现IEEE 754二进制浮点数 。 有些还提供了扩展精度 (80位),它在C中显示为long double 。 由威廉卡汉率先推出的IEEE浮点标准是一个好的工程技术胜过的胜利:在当今的机器上,它看起来过于昂贵,但在今天的机器上它便宜,并且IEEE浮动的可移植性和可预测性点数必须每年节省超过1美元的美元。


你可能知道这一点,但你可以做字面浮动/长双打

 float f = 4.0f;
 long double f = 4.0l;

Double是默认值,因为那是大多数人使用的。 长双打可能是矫枉过正或者漂浮物的精确度很差。 双工适用于几乎所有应用程序。

为什么命名? 有一天,我们所有的都是32位浮点数(实际上我们所有的都是定点数,但我离题了)。 无论如何,当浮点成为现代建筑中的流行特征时,C当时可能是dujour的语言,并且给出了“float”这个名字。 似乎是有道理的。

那时候,double可能已经被想到了,但并没有真正在当时的cpu / fp cpus中实现,这是16或32位。 一旦双层结构用于更多架构,C可能会加入它。 C需要一个浮点大小两倍的名称,因此我们得到了一个双倍的名称。 然后有人需要更精确的,我们认为他疯了。 无论如何我们都添加了它。 quadtuple(?)的名字是过度杀毒。 Long double已经足够好了,没有人发出很多噪音。

部分困惑是好的“int”似乎随着时间而改变。 它曾经是“int”意思是16位整数。 然而,Float与IEEE标准绑定为32位IEEE浮点数。 出于这个原因,C保持浮动定义为32位,并使双倍和长双重指向更长的标准。


字面

问题是,文字4.0是一个双重的,而不是一个浮动 - 这是令人生气的。

有了常量,整数和浮点数之间就有一个重要的区别。 尽管决定使用哪种整数类型(您选择的最小值足以保存该值,但对于有符号/无符号而言增加了一些复杂性)相对容易,但使用浮点数并非易事。 许多值(包括简单的值如0.1)不能用浮点数精确表示,因此类型的选择不仅会影响性能,还会影响结果值。 看起来C语言设计人员更喜欢在这种情况下对性能的稳健性,因此他们决定默认表示应该更精确。

历史

为什么不C只有短浮动,浮动和长浮动? 而在地球上“双”来自哪里?

术语“单精度”和“双精度”起源于FORTRAN,当C发明时已经被广泛使用。

链接地址: http://www.djcxy.com/p/58325.html

上一篇: Why are c/c++ floating point types so oddly named?

下一篇: How do I write a short literal in C++?