IEEE-754浮点、双精度和四精度是否保证-2、-1、-0、0、1、2的精确表示

Does IEEE-754 float, double and quad guarantee exact representation of -2, -1, -0, 0, 1, 2?

本文关键字:表示 双精度 浮点 精度 IEEE-754 是否      更新时间:2023-10-16

所有内容都在标题中:IEEE-754 floatdoublequad是否保证-2-1-0012的精确表示?

它保证所有整数的精确表示,直到有效二进制位数超过尾数的范围。

IEEE 754浮点数可用于精确存储特定范围的整数。例如:

  • binary32在C/C++中实现为float,提供24位精度,因此可以用全精度表示16位整数,例如short int
  • binary64在C/C++中实现为double,提供53位精度,可以精确地表示32位整数,例如int
  • 非标准的Intel 80位精度,由一些x86/x64编译器实现为long double,提供64个有效位,并且可以表示64位整数,例如long int(在LP64系统上,例如Unix)或long long int(在LLP64系统上,如Windows)
  • binary128实现为编译器特定类型,如__float128(GCC)或_Quad(Intel C/C++),在尾数中提供113位,因此可以精确地表示64位整数

double适用于扩展的整数范围,甚至超过了32位整数的范围,这一事实在JavaScript中使用,JavaScript没有特殊的整数数字类型,而是使用双精度浮点来表示整数。

浮点数的一个怪癖是,它们有单独的符号位,因此存在正零和负零之类的东西,这在二者的补码有符号整数表示中是不可能的。

获取任何十进制数答案的简单方法,将绝对值转换为二进制(24位表示浮点值,53位表示双精度值,113位表示四精度值),然后返回到十进制,看看是否返回相同的值。

对于整数,答案是显而易见的,并没有损失任何东西,除非值太大而无法放入给定的位数。

有理值与非整数部分的转换更有趣。在那里,当转换为具有固定宽度的二进制时,您可能会失去精度,而当转换回十进制时,您可以获得具有周期性十进制扩展的十进制值(或者如果四舍五入,则会再次失去精度)。


既然你正在涉足IEEE浮点运算,请先阅读维基百科页面,然后当你觉得自己已经准备好了解更多内容时,请继续阅读那里的第一个外部链接,"每个计算机科学家都应该知道浮点运算"