什么是最负32个浮点数的确切值?

时间:2014-10-26 19:04:26

标签: floating-point

我想知道是否存在最负32位浮点值的确切值(通过IEEE标准754)?

我在两个浮点TIFF文件中看到两个像素值,显然是针对最负的32位float

-3.4028230607370965E38
-3.4028234663852886E38

哪个是对的? (或者,特定于语言/平台的价值。)

我搜索了Google,大部分时间都获得-3.4E38,这是近似值。

谢谢,

1 个答案:

答案 0 :(得分:6)

这个答案假定float格式实际上是IEEE 754 binary32,如果它在文件格式(如TIFF)的上下文中使用,它肯定会是这样。如果架构在内部使用非IEEE 754浮点,那么在TIFF图像中处理IEEE 754二进制32号码将是这种架构的责任。

最负的浮点数的确切值是in hexadecimal, - 0x1.fffffep127。由于需要大量的数字,以十进制写入有点令人不愉快,因此人们通常会写几个十进制近似值中的一个,当转换为float时,产生这个数字。您问题中的两个值都不是-0x1.fffffep127的确切值。

请注意,“-3.4E38”不是近似值,当转换为float时,会产生最负的浮点数。这只是一个粗糙的球场。

以十进制表示的最负浮点数的确切值为:

-3.4028234663852885981170418348451692544e + 38

你问题中的第一个值,作为最负面的float的候选人是非常奇怪的,因为无论谁编写它都会打扰写错的数字,事实上,它并没有舍入到最负面的浮点数:

#include <stdio.h>
#include <float.h>
#include <math.h>

int main() {
  printf("%.38e\n", -FLT_MAX);
  printf("%.38e\n", -0x1.fffffep127);
  printf("%.38e\n",-3.4028230607370965E38f);
  printf("%.38e\n\n",-3.4028234663852886E38f);
  printf("%a\n",-3.4028230607370965E38f);
}

产:

-3.40282346638528859811704183484516925440e+38
-3.40282346638528859811704183484516925440e+38
-3.40282306073709652508363335590014353408e+38
-3.40282346638528859811704183484516925440e+38

-0x1.fffffap+127

上述程序需要printf函数,在将double转换为十进制时,会正确打印所有数字。如果这不是你所拥有的,那么程序可能会产生不同的结果,但是仍然应该显示浮点数比你问题中的第一个浮点数更负。

它表明你的问题中的第二个值是最负的浮点数的十进制近似值(当用f后缀解析时,它会舍入到相同的值),而第一个值是2 {{3}从最负的浮点数(-0x1.fffffcp + 127是最负浮点数的一个ULP,-0x1.fffffap + 127是两个ULP消息。单精度{{1}中只有23个显式有效位数格式,23不是4的倍数,因此未使用6位十六进制表示法中的最后一位。)