|
|
1
11
对。32位整数可以精确表示为64位浮点数。 |
|
|
2
9
对。这是因为您执行了两次相同的转换,并且考虑到它的确定性行为,不管舍入问题如何,最终都会得到相同的值。 不过,我们可以将您的问题概括为:
这个问题的答案也是肯定的。 一个简短的理由是尾数位上的操作(参见 http://en.wikipedia.org/wiki/Significand )如果只有可能,则是精确的;如果是32位整数值,则是可能的。 长话短说。只要整数值符合尾数部分的52位(参见 http://en.wikipedia.org/wiki/Double_precision )使用double对整数值进行的所有计算将完全正常。
这是因为你的号码(比如173
尾数上的所有操作都是直接向前的,只要它们适合尾数。整数的四舍五入发生在一个特定操作的结果不适合尾数的时候——例如,你将尾数的40位乘以尾数的40位。当指数大不相同时,浮点运算的舍入也会发生。在这种情况下,即使一个简单的加法操作也会由于马蒂萨的移位而降低精度。
回到整数编码的双偶除法运算是精确的,只要结果是整数值。所以
当您的数字不是整数时,问题就开始了。但即使在这种情况下,如果数字是
保证是真实的。 有趣的是,您可以安全地对54位有符号整数执行操作。这是因为在开始处有额外的位,其含义由指数编码,而符号则有额外的位。现在-2^53,在54位有符号整数的情况下,它将是min_int,不适合尾数,但是指数将在尾数充满零的情况下完成这项工作。 |
|
|
3
3
是的,可以将(32位)整数存储在
但是,一旦您使用
如何完成: 见 this document ( IEEE Standard 754 Floating Point Numbers by Steve Hollasch) 有关如何将整数存储为浮点值的详细信息。 总结一下(有些不准确),浮点值由三部分组成:符号位、“分数”部分(称为尾数)和“指数”部分。它们大致如下: 价值 = 1 符号位 × 分数 ×2 指数
您可以将整数值存储在
|
|
|
4
-2
我打开了Visual Studio,并对其进行了测试。 这是我的代码:
结果是两个消息框说的是真的。 我想结论是:是的,你可以保证这是真的。 编辑:延长了我的测试时间。唯一返回false的测试是double.maxvalue的测试,但我怀疑您是否会使用这么大的数字。 |