【发布时间】:2016-07-02 06:55:28
【问题描述】:
编辑(第三次): 回应到目前为止的答案,让我澄清一点:
- @Lưu Vĩnh Phúc 正如他敏锐地指出的那样,在我原来的表达中,
算术运算的精度由精度决定 不太精确的操作数。
我应该使用准确度而不是精确度。即
算术运算的准确性由准确性决定 不太准确的操作数。
是的,我不小心使用了精确度而不是准确度,并在我的许多论点中继续使用它。我为我的愚蠢错误和相应的困惑道歉。
所以问题被重述:
例如:
auto test=100. *3.f;
那么,变量test是double类型的。
我对这个选择感到困惑。因为从数学上讲,算术运算的准确性是由不太准确的操作数的准确性决定的。在我们的例子中,3.f 在最多 8 位之后已经无法保证其准确性,将 test 存储为具有 15 位精度的可能误导印象的双精度有什么意义?
我的猜测是它可能与指数有关,但在这种情况下,结果是 300,它不会超出浮点数的范围。还是有什么历史原因?
非常感谢,
我再次为我的愚蠢道歉。
总结到目前为止的答案: 1,是的,它是关于范围的; 2、当double*float->double时,有很多截断。
【问题讨论】:
-
那不是VS的东西,甚至不是C++的东西,每种编程语言都是这样的。
-
三、二、一……的标准引述
-
...zero: "...否则,如果任一操作数为双精度,则另一个应转换为双精度..."
-
您的编辑没有比您原来的问题更有意义。
1.1 * 1.5的结果是 1.65,原因在我的回答中给出。1.5 * 1.2 = 1.80,出于同样的原因。 -
在任何基数中,n 位和 m 位数字的乘积是 (n+m) 位数字,因此即使
int*int -> int产生的位数是它可以拥有的位数的两倍。将结果存储在比原始类型更窄的类型中更糟糕。double*float->double需要大量截断,将结果存储在 float 中没有意义