在C ++中将浮点数乘以两次溢出

时间:2020-08-25 17:40:15

标签: c++ floating-point truncate

我对收到此警告的观点感到困惑:
算术溢出:对4字节的值使用运算符'',然后将结果强制转换为8字节的值。在调用''运算符之前,将值强制转换为更广泛的类型,以避免溢出。

#include <iostream>
using std::cin;
using std::cout;
using std::ios_base;

int main() {
    cout.setf(ios_base::fixed, ios_base::floatfield);
    double mints = 10.0 / 3.0;
    const float c_MILLION = 1e6;
    cout << "\n10 million mints: " << 10 * c_MILLION * mints;

    cin.get();
}

根据我的理解,当我们将float值与double值相乘时,我们基本上是将4byte值与8byte值相乘,因此,根据阅读的链接,我们将失去一些精度:

http://www.cplusplus.com/articles/DE18T05o/#:~:text=Overflow%20is%20a%20phenomenon%20where,be%20larger%20than%20the%20range

但是,当我输出时,我得到一个双精度值
https://i.stack.imgur.com/EOQzm.png

如果是这种情况,为什么要警告我将c_MILLION强制转换为双精度值(如果它会自动将其转换为双精度值)?无论如何,它无法将8byte值转换为4byte值。那么,为什么在已经使我们免于这种麻烦的情况下警告程序员呢?
还是可以将8byte值转换为4byte值。如果是这样,它如何确定要打印的类型?我无法从阅读的链接中找到答案,这是一个问题。
如果自动将结果转换为8byte值,显示此警告的意义是什么?
这是警告:
https://i.stack.imgur.com/L2szy.png

严重性代码描述项目文件行抑制状态 警告C26451算术溢出:对4字节值使用运算符'*',然后将结果转换为8字节值。在调用运算符'*'之前将值强制转换为更宽泛的类型,以避免溢出(io.2)

问题是我将int值与double值相乘。但是,当它自动将intdouble的乘法转换为double值时,警告仍然不存在。

1 个答案:

答案 0 :(得分:1)

警告是由于以下乘法引起的:10 * c_MILLION。可能存在c_MILLION的某些值,如果先将c_MILLION转换为double,则可能会损失一些精度。由于该乘法的结果被转换为double,所以错误的程序员可能会认为没有损失精度,如果操作数首先是double,则精度可能会超出预期。因此,警告。

相关问题