无法摆脱C++警告

uyhoqukh  于 2023-10-21  发布在  其他
关注(0)|答案(2)|浏览(127)

我是C++的新手,这个警告让我抓狂。
警告C4244“参数”:从“double”转换为“int”,第41行可能丢失数据
这一行是:

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

我已经检查了我的代码,它似乎与类型一致(就我而言)。我已经清除/重建解决方案,重新启动VS几次。
通过简单地删除部分线路,问题似乎在这里:

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

当我把它换成其他东西时,警告就消失了。除了这个,我没有别的警告。
有什么细微差别我不明白吗?
以下是我的完整代码:

  1. int main() {
  2. double x = -1;
  3. const size_t size = 4;
  4. double coeff[size] = {0};
  5. cout << Horner(coeff, size, x);
  6. return 0;
  7. }
  1. #include <iostream>
  2. #include "header.h"
  3. #include <cmath>
  4. #include <cassert>
  5. using namespace std;
  6. void fillArray(double* coeff, size_t size)
  7. {
  8. srand(static_cast<unsigned int>(time(NULL)));
  9. double lower_bound = 0;
  10. double upper_bound = 100;
  11. for (int i = 0; i < size; i++) {
  12. coeff[i] = (rand() % 2001 - 1000) / 100.0;
  13. }
  14. for (int i = 0; i < size; i++) {
  15. cout << "Coefficients: " << coeff[i] << " " << endl;
  16. }
  17. return;
  18. }
  19. double sum(double* coeff, size_t size, int sign)
  20. {
  21. size_t s = size;
  22. double sum = 0;
  23. for (int i = 0; i < size; i++) {
  24. if (s % 2 == 1 || sign == 1) {
  25. sum = sum + coeff[i];
  26. } else sum = sum - coeff[i];
  27. s--;
  28. }
  29. return sum; //sum is accurately calculated for x = -1 and x = 1
  30. }
  31. double Horner(double* coeff, size_t size, double x)
  32. {
  33. fillArray(coeff, size);
  34. double term = coeff[0];
  35. for (int i = 0; i < size - 1; i++) {
  36. term = coeff[i + 1] + term * x;
  37. }
  38. double result = term;
  39. ((x == 1) || (x == -1)) ? (result == sum(coeff, size, x)) : (true);
  40. return result;
  41. }
b1payxdu

b1payxdu1#

Horner的定义是

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

它将double x作为第三个参数。sum的定义是

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

它将int作为第三个参数。
由于在Hornersum中传入了x(这是一个double),因此需要进行doubleint的类型转换。

vc9ivgsu

vc9ivgsu2#

有什么细微差别我不明白吗?
编译器警告的原因是在对sum的调用中使用了x

  1. sum(coeff, size, x)
  2. // ^^^

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

  1. int sign = static_cast<int>(x);

然后使用sum(coeff, size, sign)
您也可以内联static_cast。使用sum(coeff, size, static_cast<int>(x))

免责声明

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

展开查看全部

相关问题