Rod*_*ddy 15 c c++ floating-point history ieee-754
C++提供了三种浮点类型:float,double和long double.我不经常在我的代码中使用浮点数,但是当我这样做时,我总是被类似无害线路上的警告所困扰
float PiForSquares = 4.0;
Run Code Online (Sandbox Code Playgroud)
问题是文字4.0是双重的,而不是浮动的 - 这很刺激.
对于整数类型,我们有short int,int和long int,这非常简单.为什么C不具有短浮动,浮动和长浮动?在地球上"双重"来自哪里?
编辑:浮动类型之间的关系似乎与整数类似.double必须至少与float一样大,而long double至少与double一样大.没有其他精度/范围的保证.
Nor*_*sey 33
术语"单精度"和"双精度" 起源于FORTRAN,并且在C被发明时已经广泛使用.在20世纪70年代早期的机器上,单精度显着提高了效率,而今天,使用的内存是双精度的一半.因此,它是浮点数的合理默认值.
long double
在IEEE标准允许使用80位浮点数而不是传统的64位双精度的英特尔80287浮点芯片时,很久以后就添加了它.
提问者对保证不正确; 今天,几乎所有语言都保证以单精度(32位)和双精度(64位)实现IEEE 754二进制浮点数.有些还提供扩展精度(80位),以C为单位显示long double
.由William Kahan带头的IEEE浮点标准是一个优秀工程胜过权宜之计的胜利:在当今的机器上,它看起来非常昂贵,但在今天的机器上它很便宜,并且IEEE浮动的便携性和可预测性点数必须每年节省数百美元.
Dou*_* T. 24
你可能知道这一点,但你可以制作文字浮点数/长双打
float f = 4.0f;
long double f = 4.0l;
Run Code Online (Sandbox Code Playgroud)
Double是默认值,因为这是大多数人使用的.长双打可能是矫枉过正或浮球的精度非常差.Double适用于几乎所有应用程序.
为什么要命名?有一天,我们所拥有的是32位浮点数(实际上我们所拥有的只是定点数,但我离题了).无论如何,当浮点成为现代建筑中的流行特征时,C可能是当时的语言dujour,并且给出了名称"float".似乎有意义.
当时,可能已经考虑过double,但在当时的cpu/fp cpus中没有真正实现,这是16位或32位.一旦双人在更多的架构中使用,C可能会开始添加它.C需要一个名字,一个浮动大小的两倍,因此我们得到了一个双倍.然后有人需要更精确,我们认为他疯了.无论如何我们加了它.名称quadtuple(?)是矫枉过正的.长双足够好,没有人发出很多噪音.
令人困惑的部分原因是,良好的"int"似乎随着时间而变化.过去,"int"表示16位整数.但是,Float与IEEE标准绑定为32位IEEE浮点数.出于这个原因,C保持浮动定义为32位,并使得双倍和长倍指代更长的标准.
问题是文字 4.0 是一个双精度数,而不是一个浮点数——这很烦人。
对于常量,整数和浮点数之间有一个重要区别。虽然决定使用哪种整数类型相对容易(您选择足够小的值来保存值,增加了有符号/无符号的复杂性),但对于浮点数却不是那么容易。许多值(包括像 0.1 这样的简单值)不能用浮点数精确表示,因此类型的选择不仅会影响性能,还会影响结果值。在这种情况下,C 语言设计者似乎更喜欢对性能的鲁棒性,因此他们决定默认表示应该是更精确的表示。
为什么 C 不只有短浮点数、浮点数和长浮点数?而“双重”究竟从何而来?
术语“单精度”和“双精度”起源于 FORTRAN 并且在 C 被发明时已经被广泛使用。