gpt4 book ai didi

c++ - 算术溢出:对4字节值使用运算符 '*',然后将结果转换为8字节值

转载 作者:行者123 更新时间:2023-12-02 10:22:55 26 4
gpt4 key购买 nike

我正在尝试编写一个程序来求解一个二次方程,该二次方程的系数的绝对值不超过100,并且可以保证如果存在任何根,则它们是整数。这是我尝试过的:

#include <cmath>
#include <iostream>

int main() {
int a, b, c; // coefficients of quadratic equation
std::cin >> a >> b >> c;
int d = b * b - 4 * a * c; // discriminant

if (d < 0)
std::cout << "No roots";
else if (d == 0)
std::cout << "One root: " << -b / (2 * a);
else
std::cout << "Two roots: " << (-b - std::sqrt(d)) / (2 * a) << " "
<< (-b + std::sqrt(d)) / (2 * a);

return 0;
}

它工作正常,但是Visual Studio 2019会显示以下警告:

Arithmetic overflow: Using operator '*' on a 4 byte value and then casting the result to a 8 byte value. Cast the value to the wider type before calling operator '*' to avoid overflow (io.2).



enter image description here

究竟为什么会弹出此警告,它试图告诉我什么?我在做什么错,如何解决该问题?

我在SO上看过 this,但我不认为这是一个错误。

最佳答案

此处的根本原因(非常受欢迎)是二次方程式不是Diophantine equation。它适用于实数,尤其是sqrt(d)通常不是整数。

在C++中,sqrt(IntegralType)的返回类型为double。因此,2*a也将转​​换为double,但仅在乘法之后才能转换。而且Visual Studio非常合理地指出,最好在乘法之前进行转换。只是没有注意到您甚至可以从一开始就使a,b,c翻倍。

关于c++ - 算术溢出:对4字节值使用运算符 '*',然后将结果转换为8字节值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59308422/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com