C ++提供了三种浮点类型:float,double和long double。我不经常在我的代码中使用浮点数,但是当我这样做时,我总是会被像无处不在的线路上的警告所抓住,如
float PiForSquares = 4.0;
问题是文字4.0是双重的,而不是浮动的 - 这很刺激。
对于整数类型,我们有short int,int和long int,这非常简单。为什么C不具有短浮动,浮动和长浮动?在地球上“双重”来自哪里?
编辑:浮动类型之间的关系似乎与整数类似。 double必须至少与float一样大,而long double至少与double一样大。没有其他保证精度/范围。答案 0 :(得分:33)
术语“单精度”和“双精度”起源于FORTRAN ,并且在C被发明时已经广泛使用。在20世纪70年代早期的机器上,单精度显着提高效率,而今天,使用的内存是双精度的一半。因此,对于浮点数,它是合理的默认值。
当IEEE标准允许使用80位浮点数而不是经典64位浮点数时, long double
稍后添加 双精度。
提问者对保证不正确;今天几乎所有语言都保证以单精度(32位)和双精度(64位)实现IEEE 754二进制浮点数。有些还提供扩展精度(80位),它在C中显示为long double
。由William Kahan带头的IEEE浮点标准是一个优秀工程胜过权宜之计的胜利:在当今的机器上,它看起来非常昂贵,但在今天的机器上它很便宜,并且IEEE浮动的便携性和可预测性点数必须每年节省数百美元。
答案 1 :(得分:24)
你可能知道这一点,但你可以制作文字花车/长双打
float f = 4.0f;
long double f = 4.0l;
Double是默认值,因为这是大多数人使用的。长双打可能是矫枉过正或浮球的精度非常差。 Double适用于几乎所有应用程序。
为什么要命名?有一天,我们所拥有的是32位浮点数(实际上我们所拥有的只是定点数,但我离题了)。无论如何,当浮点成为现代建筑中的流行特征时,C可能是当时的语言dujour,并且给出了名称“float”。似乎有意义。
当时,可能已经考虑过double,但在当时的cpu / fp cpus中没有真正实现,这是16位或32位。一旦双人在更多的架构中使用,C可能会开始添加它。 C需要一个名字,一个浮动大小的两倍,因此我们得到了一个双倍。然后有人需要更精确,我们认为他疯了。无论如何我们加了它。名称quadtuple(?)是矫枉过正的。长双足够好,没有人发出很多噪音。
令人困惑的部分原因是,良好的“int”似乎随着时间而变化。过去,“int”表示16位整数。但是,Float与IEEE std绑定为32位IEEE浮点数。出于这个原因,C保持浮动定义为32位,并使得双倍和长倍指代更长的标准。
答案 2 :(得分:4)
问题是文字4.0是双重的,而不是浮动的 - 这很刺激。
使用常量,整数和浮点数之间存在一个重要区别。虽然决定使用哪种整数类型相对容易(你选择的最小值足以容纳该值,但有一些增加了signed / unsigned的复杂性),使用浮点数并不容易。许多值(包括简单的值,如0.1)不能用浮点数精确表示,因此类型的选择不仅会影响性能,还会影响结果值。在这种情况下,C语言设计者似乎更喜欢对性能的鲁棒性,因此他们认为默认表示应该更精确。
为什么C只有短浮动,浮动和长浮动?在地球上“双重”来自哪里?
术语“单精度”和“双精度”起源于FORTRAN,并且在C被发明时已经广泛使用。
答案 3 :(得分:2)
首先,这些名称并非特定于C ++,但对于实现IEEE 754的任何浮点数据类型来说,这是非常常见的做法。
名称'double'指的是'double precision',而float通常被称为'single precision'。
答案 4 :(得分:1)
两种最常见的浮点格式使用32位和64位,较长的一种是第一种的“双”大小,因此称为“双”。
答案 5 :(得分:1)
double是这样命名的,因为它是float的“精度”的两倍。真的,这意味着它使用浮点值的两倍空间 - 如果你的浮点数是32位,那么你的双精度数将是64位。
名称双精度有点用词不当,因为双精度浮点数的尾数精度为52位,其中单精度浮点数的尾数精度为23位(双精度为56)。有关浮点的更多信息:Floating Point - Wikipedia,包括 底部链接到单精度和双精度浮动的文章。
名称long double可能与整数类型的长整数与短整数相同,除非在这种情况下它们反转它,因为'int'相当于'long int'。
答案 6 :(得分:1)
在定点表示中,小数点后面有一个固定的位数(十进制表示中小数点的推广)。与此相对于浮点表示,其中小数点可以在所表示的数字的数字内移动或浮动。因此名称为“浮点表示”。这缩写为“浮动”。
在K& RC中,float
引用具有32位二进制表示的浮点表示,double
引用具有64位二进制表示的浮点表示,或者是大小的两倍,从而名字。但是,原始的K& R规范要求所有浮点计算都以双精度完成。
在最初的IEEE 754标准(IEEE 754-1985)中,为单精度和双精度浮点数的二进制表示提供了浮点表示和算术的金标准。双精度数字恰如其分,因为它们的位数是单精度数的两倍。
有关浮点表示的详细信息,请阅读David Goldberg的article,每个计算机科学家应该知道的关于浮点运算的内容。
答案 7 :(得分:1)
它们被称为单精度和双精度,因为它们与处理器的自然大小(不确定术语)有关。因此,32位处理器的单精度将是32位长,其双精度将是64位长的两倍。他们刚决定在C中调用单精度类型“float”。
答案 8 :(得分:0)
double是“双精度”的缩写。 我想,当一个具有更高精度的浮点类型开始出现在处理器上时,我不想添加另一个关键字。
答案 9 :(得分:0)
好的,历史上这里是以前的方式:
用于C的原始机器有16位字,分成2个字节,char是一个字节。地址是16位,所以sizeof(foo*)
是2,sizeof(char)
是1.一个int是16位,所以sizeof(int)
也是2.然后VAX(扩展寻址)机器出现了,地址是32位。 char仍然是1个字节,但sizeof(foo*)
现在是4。
有一些混乱,它在Berkeley编译器中得到了解决,因此short现在是2个字节,int是4个字节,因为它们非常适合高效的代码。长时间变为8个字节,因为对于8字节块有一种有效的寻址方法---它被称为双字。 4个字节的块是字,当然,2个字节的块是 halfwords 。
浮点数的实现使得它们适合单个单词或双字。为了保持一致,双字浮点数被称为“双”。
答案 10 :(得分:0)
应该注意的是,double
不一定能够保持的数值大于float
的数值;它只需要更精确 。
答案 11 :(得分:0)
因此浮点类型的%f和长浮点的%lf与double相同。