C、不从 <float.h> 获取最大 float 或 maximum double
C, getting the maximum float or maximum double not from <float.h>
我正在完成书 "C. Programming language",但遇到了我应该在不使用任何标准库的情况下获取浮点数的 maximum\minimum 值的问题,例如 <float.h>
。谢谢
“不使用”练习有点傻,所以这里是一个“不使用”的版本 header.
…
double nextafter(double, double);
double max = nextafter(1.0 / 0.0, 0.0);
…
并且不使用任何库函数,仅假设 double
映射到 IEEE 754 的 binary64 格式(一个非常常见的选择):
…
double max = 0x1.fffffffffffffp1023;
…
从维基百科,您可以阅读 IEEE 浮点格式:http://en.wikipedia.org/wiki/Single-precision_floating-point_format
这包含
符号位:1位
指数宽度:8位
有效位数精度:24 位(显式存储 23 位)
该页面还包含有关如何解释指数值的信息。如果有效值为零,则指数中的 0xFF (255) 值表示±无穷大,否则表示 NaN(不是数字)。 +-无穷大是最大的数字。符号位定义数字是 +infinity 还是 -infinity。如果问题是关于最大的非无限值,那么就使用最大的非特殊值。
最大的非无限值是 24 位的有效位 1 和 0xFE (254) 作为指数。由于指数被偏移,因此实际值类似于:significand * 2^(254-127),根据维基百科页面,它接近十进制的 3.402823 × 10^38。如果您想要最小值,只需打开符号位即可获得与负值完全相同的值。
编辑:因为这是关于 C 的,所以我假定 32 位 IEEE 浮点数。
您可以通过执行 sizeof(type)*8 计算出数字所占的位数。
然后看http://en.wikipedia.org/wiki/Double-precision_floating-point_format or http://en.wikipedia.org/wiki/Single-precision_floating-point_format
这样您就可以根据位数在 table 中查找它。
这假定该结构使用 IEEE 754。
您可以从 IEEE 定义开始,然后从那里开始工作。例如,指数的位数,尾数的位数。当你研究格式时,你会看到尾数的 23 位实际上代表 24 位。原因是,尾数是 "normalised",即它被左移,因此 ms 位始终为 1。这给出了从计算中保留的最大有效位数。第24位去哪儿了?因为它总是存在(除了 0
值),所以它是 "implied" 作为第 24 位。
假设二进制浮点格式,从 2.0 开始并乘以 2.0 直到溢出。这决定了最大指数。然后,从 x 作为溢出前的数字开始,取总和 x + x/2 + x/4 + ... 直到加上x/q都没有改变数字的值(或者再次溢出)。这决定了最大尾数。
最小的可表示正数可以用类似的方法找到。
我正在完成书 "C. Programming language",但遇到了我应该在不使用任何标准库的情况下获取浮点数的 maximum\minimum 值的问题,例如 <float.h>
。谢谢
“不使用”练习有点傻,所以这里是一个“不使用”的版本 header.
…
double nextafter(double, double);
double max = nextafter(1.0 / 0.0, 0.0);
…
并且不使用任何库函数,仅假设 double
映射到 IEEE 754 的 binary64 格式(一个非常常见的选择):
…
double max = 0x1.fffffffffffffp1023;
…
从维基百科,您可以阅读 IEEE 浮点格式:http://en.wikipedia.org/wiki/Single-precision_floating-point_format
这包含
符号位:1位
指数宽度:8位
有效位数精度:24 位(显式存储 23 位)
该页面还包含有关如何解释指数值的信息。如果有效值为零,则指数中的 0xFF (255) 值表示±无穷大,否则表示 NaN(不是数字)。 +-无穷大是最大的数字。符号位定义数字是 +infinity 还是 -infinity。如果问题是关于最大的非无限值,那么就使用最大的非特殊值。
最大的非无限值是 24 位的有效位 1 和 0xFE (254) 作为指数。由于指数被偏移,因此实际值类似于:significand * 2^(254-127),根据维基百科页面,它接近十进制的 3.402823 × 10^38。如果您想要最小值,只需打开符号位即可获得与负值完全相同的值。
编辑:因为这是关于 C 的,所以我假定 32 位 IEEE 浮点数。
您可以通过执行 sizeof(type)*8 计算出数字所占的位数。 然后看http://en.wikipedia.org/wiki/Double-precision_floating-point_format or http://en.wikipedia.org/wiki/Single-precision_floating-point_format
这样您就可以根据位数在 table 中查找它。 这假定该结构使用 IEEE 754。
您可以从 IEEE 定义开始,然后从那里开始工作。例如,指数的位数,尾数的位数。当你研究格式时,你会看到尾数的 23 位实际上代表 24 位。原因是,尾数是 "normalised",即它被左移,因此 ms 位始终为 1。这给出了从计算中保留的最大有效位数。第24位去哪儿了?因为它总是存在(除了 0
值),所以它是 "implied" 作为第 24 位。
假设二进制浮点格式,从 2.0 开始并乘以 2.0 直到溢出。这决定了最大指数。然后,从 x 作为溢出前的数字开始,取总和 x + x/2 + x/4 + ... 直到加上x/q都没有改变数字的值(或者再次溢出)。这决定了最大尾数。
最小的可表示正数可以用类似的方法找到。