Visual Studio 2017中实现sin(x)近似算法时出现编译构建错误求助
解决Visual Studio 2017中sin(x)近似实现的编译错误
我来帮你逐个拆解并解决这些编译问题:
1. 核心错误:sin函数重定义(C2382)
你代码里包含了<cmath>头文件,这个头文件已经自带了标准库的sin函数,它的签名和异常规范和你自己定义的float sin(float)不一致,所以编译器直接报了重定义错误。解决这个问题最直接的办法就是给你的正弦近似函数改个名字,比如改成my_sin,需要同步修改三个地方:
- 函数声明:把
float sin(float);改成float my_sin(float); - 函数定义:把
float sin(float x)改成float my_sin(float x) - 主函数里的调用:把
printf("%f", sin(x));改成printf("%f", my_sin(x));
2. 连锁错误:函数调用失败(C2264)
这个错误其实是第一个重定义问题引发的连锁反应——编译器因为识别不了你的sin函数,所以判定你调用了一个有问题的函数。等你解决完第一个错误后,这个问题会自动消失。
3. printf参数警告(C4473)
这个警告看起来有点奇怪,毕竟你的代码里printf明明带了参数,但大概率是重定义问题导致编译器解析混乱。修改完函数名后,这个警告应该也会跟着消失。另外,你代码里的system("cease");是笔误吧?正确的暂停命令是system("pause");,不然程序运行后会直接退出,你根本看不到输出结果。
修改后的完整可编译代码
/*Approximate sinx*/ #include <stdio.h> #include <stdlib.h> #include <cmath> // 改名避免和标准库冲突 float my_sin(float); float factor(int); float times(float, int); int main() { float x; scanf_s("%f", &x); // 调用改名后的函数 printf("%f", my_sin(x)); // 修正暂停命令 system("pause"); return 0; } float factor(int x) { float factor = 1; for (int i = 1; i <= x; i++) { factor *= i; } return factor; } float times(float x, int y) { float times = 1; for (int i = 0; i < y; i++) { times *= x; } return times; } // 函数名同步修改 float my_sin(float x) { float sinx = 0; int t = 1; // 泰勒级数收敛很快,20次足够达到float精度,避免阶乘溢出 for (int i = 1; i <= 20; i++) { sinx += t * times(x, 2 * i - 1) / factor(2 * i - 1); t *= -1; } return sinx; }
额外提一句:你的原代码循环跑了1000次,但泰勒级数收敛速度很快,跑20次左右就足够达到float的精度了。而且当i太大时,factor(2*i-1)会因为float的数值范围限制溢出,反而导致计算错误,所以我把循环次数改成了20。
内容的提问来源于stack exchange,提问作者Maxmoe
相关产品推荐
相关产品推荐

