无法摆脱 C++ 警告

Can't get rid of the C++ warning

提问人:Nadia 提问时间:10/12/2023 最后编辑:Remy LebeauNadia 更新时间:10/12/2023 访问量:102

问:

我是 C++ 的新手,这个警告让我发疯。

警告 C4244“argument”:从“double”转换为“int”,第 41 行可能丢失数据

该行是:

((x == 1) || (x == -1)) ? (result == sum(coeff, size, x)) : (true);

我已经检查了我的代码,它似乎与类型一致(就我而言)。我已经清除/重建解决方案,重新启动了几次 VS。

通过简单地删除部分线路,问题似乎就在这里:

(result == sum(coeff, size, x)

当我用其他任何东西替换它时,警告就会消失。除了这个警告,我没有其他警告。

有没有我不明白的细微差别?

这是我的完整代码:

int main() {

    double x = -1;
    const size_t size = 4;
    double coeff[size] = {0};
    cout << Horner(coeff, size, x);

    return 0;
}
#include <iostream>
#include "header.h"
#include <cmath>
#include <cassert>
using namespace std;

void fillArray(double* coeff, size_t size)
{
    srand(static_cast<unsigned int>(time(NULL)));
    double lower_bound = 0;
    double upper_bound = 100;
    for (int i = 0; i < size; i++) {
        coeff[i] = (rand() % 2001 - 1000) / 100.0;
    }
    for (int i = 0; i < size; i++) {
        cout << "Coefficients: " << coeff[i] << " " << endl;
    }
    return;
}
double sum(double* coeff, size_t size, int sign)
{
    size_t s = size;
    double sum = 0;
    for (int i = 0; i < size; i++) {  
        if (s % 2 == 1 || sign == 1) {
            sum = sum + coeff[i];
        } else sum = sum - coeff[i];
        s--;
    }
    return sum; //sum is accurately calculated for x = -1 and x = 1
}
double Horner(double* coeff, size_t size, double x)
{
    fillArray(coeff, size);
    double term = coeff[0];
    for (int i = 0; i < size - 1; i++) {
        term = coeff[i + 1] + term * x;
    }

    double result = term;
    ((x == 1) || (x == -1)) ? (result == sum(coeff, size, x)) : (true);
    return result;
}
C++ 类型 编译器警告

评论

2赞 273K 10/12/2023
使用 as double 看起来很可疑。 - 不合理地使用三元运算符。true((x == 1) || (x == -1)) ? (result == sum(coeff, size, x)) : (true);
0赞 ChrisMM 10/12/2023
除了上述...您实际上并没有将其分配给任何地方:)该三元 if 的结果将被丢弃
2赞 Remy Lebeau 10/12/2023
你的意思是分配 to 的返回值吗? 是一种比较。也许你的意思是相反?sum()result==double result = ((x == 1) || (x == -1)) ? sum(coeff, size, x) : term;
1赞 Remy Lebeau 10/12/2023
顺便说一句:可以写得更好for (int i = 0; i < size - 1; i++) { term = coeff[i + 1] + term * x; }for (int i = 1; i < size; i++) { term = coeff[i] + term * x; }
0赞 BoP 10/12/2023
“因为这只是一个比较”哦,所以不写这样的代码的另一个原因。它完全欺骗了我!

答:

3赞 dsouzai 10/12/2023 #1

的定义是Horner

double Horner(double* coeff, size_t size, double x)

它作为第三个参数。的定义是double xsum

double sum(double* coeff, size_t size, int sign)

它以 a 作为第三个参数。int

由于您要传入(即 ) 到 ,因此存在 to 类型转换。xdoubleHornersumdoubleint

评论

0赞 Nadia 10/12/2023
非常感谢您的帮助!该警告现已修复
2赞 R Sahu 10/12/2023 #2

有没有我不明白的细微差别?

编译器警告的提示是在调用 of 时使用的:xsum

sum(coeff, size, x)
//              ^^^

您可以通过使用类型的变量并适当设置其值来删除该警告。int

int sign = static_cast<int>(x);

然后使用sum(coeff, size, sign)

您也可以内联 .用。static_castsum(coeff, size, static_cast<int>(x))

免責聲明

发布的代码中还有其他逻辑问题,您可能需要单独解决。

评论

0赞 Nadia 10/12/2023
谢谢!你能指出这些问题吗
1赞 R Sahu 10/12/2023
@Nadia,雷米·勒博(Remy Lebeau)的第二条评论描述了我正在考虑的问题。