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