在 C++ 中将 float 与双溢出相乘
Multiplying float with double overflow in C++
我对这个警告的意义有点困惑:
算术溢出:对 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 值,因此,根据我阅读的链接,我们将失去一些精度:
- Cannot implicitly convert type 'double' to 'float'
- Multiply a float with a double
但是,当我输出这个时,我得到了一个双精度值
https://i.stack.imgur.com/EOQzm.png
如果是这样,为什么它会警告我将 c_MILLION 转换为双精度值(如果它自动将其更改为双精度结果)?无论如何,它不能将 8 字节的值转换为 4 字节的值。那么,当它已经使我们免于这种麻烦时,为什么还要费心去警告程序员呢?
或者它也可以将 8 字节值转换为 4 字节值。如果是这样,它如何确定要打印的类型?这是一个我无法从阅读的链接中找到答案的问题。
如果它自动将结果转换为 8byte 值,显示此警告的意义何在?
这是警告:
https://i.stack.imgur.com/L2szy.png
严重性代码说明项目文件行抑制状态
警告 C26451 算术溢出:对 4 字节值使用运算符“*”,然后将结果转换为 8 字节值。在调用运算符 '*' 之前将值转换为更宽的类型以避免溢出 (io.2)
问题是我将 int
值与 double
值相乘。但是当它自动将 int
与 double
的乘法转换为 double
值时,警告仍然不应该存在。
警告是因为这个乘法:10 * c_MILLION
。 c_MILLION
的某些值可能会丢失一些精度,如果 c_MILLION
首先转换为 double
则不会丢失。由于此乘法的结果被转换为 double
,错误的程序员可能会认为如果操作数首先是 double
,则没有超出预期的精度损失。因此警告。
我对这个警告的意义有点困惑:
算术溢出:对 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 值,因此,根据我阅读的链接,我们将失去一些精度:
- Cannot implicitly convert type 'double' to 'float'
- Multiply a float with a double
但是,当我输出这个时,我得到了一个双精度值
https://i.stack.imgur.com/EOQzm.png
如果是这样,为什么它会警告我将 c_MILLION 转换为双精度值(如果它自动将其更改为双精度结果)?无论如何,它不能将 8 字节的值转换为 4 字节的值。那么,当它已经使我们免于这种麻烦时,为什么还要费心去警告程序员呢?
或者它也可以将 8 字节值转换为 4 字节值。如果是这样,它如何确定要打印的类型?这是一个我无法从阅读的链接中找到答案的问题。
如果它自动将结果转换为 8byte 值,显示此警告的意义何在?
这是警告:
https://i.stack.imgur.com/L2szy.png
严重性代码说明项目文件行抑制状态
警告 C26451 算术溢出:对 4 字节值使用运算符“*”,然后将结果转换为 8 字节值。在调用运算符 '*' 之前将值转换为更宽的类型以避免溢出 (io.2)
问题是我将 int
值与 double
值相乘。但是当它自动将 int
与 double
的乘法转换为 double
值时,警告仍然不应该存在。
警告是因为这个乘法:10 * c_MILLION
。 c_MILLION
的某些值可能会丢失一些精度,如果 c_MILLION
首先转换为 double
则不会丢失。由于此乘法的结果被转换为 double
,错误的程序员可能会认为如果操作数首先是 double
,则没有超出预期的精度损失。因此警告。