(所讨论的所有数字均为十进制)
假设我们有一个浮点数据类型,如:
m * 10 ^ e
where m is the mantissa . and max mantissa size is 1 ( 0 <= m <= 9);
e is the exponent and its size is -1 <= e <= 1
我们说我们的数据类型Max值是90,其Min值是0
但是,这并不意味着我们可以代表这个限制中的所有数字。 我们只能代表不包括零的27个数字(9 * 3)。
具体而言,我们不能以这种方式表示89,因为它有两位数的尾数 (并且它们不为零)。
技术上类似于上面的描述。在float数据类型(在任何编程语言中)中,Max和Min值之间必须有一些整数,我们不能将它们存储在float数据类型中。
是上面的论证声音。如果是,请举例说明如何在java或c中显示这个?
答案 0 :(得分:2)
你的推理完全合情合理。最容易展示的就是例子,就像你做的那样。
考虑IEEE-754定义的“通常单浮点”格式,它有7个指数位,因此范围超出[-2^127,2^127]
。
它还有24个尾数位,所以让我们考虑一下 这些数字分别为2 ^ 26,2 ^ 26 + 1和2 ^ 26 + 2.
尝试将它们标准化以便以浮点格式编写它们,您将看到
因此,您有一个例子,如89:67108865在浮点数中无法表示。
*除了次正规,见下文(扩展评论)
我确实在这里跳过了一部分。指数不是直接编码在保留的位中,而是偏置。在单浮点的情况下,偏差为127。
所以我们的26实际上由26 + 127表示,因此153.从维基百科窃取下面的图像:
如果您在编写这些数字(符号,指数和尾数)时想要表示非次正规数,则得到:( - 1) sign * 2 ( exponent-127) * 1.mantissa
一旦我们达到可能的最小指数,即一旦我们将其写为0并且意味着-127,我们就停止假设初始1.这样,我们可以表示小于2的数字 -127 (通过牺牲精度,因为我们将在尾数上有前导0。)
然后我们有:( - 1) sign * 2 -127 * 0.mantissa
特别是,当尾数全为0时,我们有0,这是预期的:现在,在其二进制表示中只有0的数字被读为0.在某种程度上,0是次正规数中最小的(虽然在实践中人们认为它本身就是一个特例。
其他特殊情况是指数为1时。如果尾数全是0,那么你有+/-无穷大(取决于符号),如果设置了一些尾数位,你就有NaN。
答案 1 :(得分:0)
是的,您的推理是合理的,并且应该很容易找到无法在您的数据类型中表示的实数。
考虑允许的最小尾数(0)和指数(-1):
0 * 10 ^ -1
= 0.0
你允许的下一个更高的尾数是1:
1 * 10 ^ -1
= 0.1
您不能表示介于0.0和0.1之间的任何实数,例如0.05。
您应该能够用Java或C表达它。