计算器cos()仅支持角度?Arduino代码因未转弧度调用cos()失效求助
关于cos函数弧度/角度的疑问及Arduino代码修复
一、为什么cos()函数默认用弧度,而计算器支持角度?
其实核心原因是数学定义和使用场景的差异:
- 从数学本质来说,弧度是「自然的角度度量单位」——它把角度和圆的弧长直接挂钩(1弧度对应弧长等于半径的圆心角),微积分里的三角函数公式(比如泰勒展开式)、导数公式都是基于弧度推导的,编程语言里的数学库(包括Arduino用的)都是遵循这个数学标准,所以默认用弧度。
- 而计算器是面向普通用户设计的,大家日常接触的角度都是0-360度的直观概念,所以默认提供角度输入,降低使用门槛。
二、你的Arduino代码修复方案
原代码有几个关键问题导致无法运行,我帮你逐一修正:
- 变量类型错误:用
int会丢失浮点运算的精度,比如cos的结果是小数,用int直接存储会被截断成0或1,完全错误; - 未将角度转换为弧度:Arduino的
cos()只接受弧度参数,必须先用radians()函数把0-180的角度转成弧度; - 语法错误:好几行末尾缺少分号,这会直接导致编译失败;
- 运算逻辑的精度问题:所有参与浮点运算的变量都要改成
float类型。
修复后的代码如下:
const float b = 200.0; // 改用float保留精度 const int Pin = A0; // 电位器引脚 float c = 0.0; // 存储角度值(浮点型) float d = 0.0; // 中间计算值 float e = 0.0; // 最终边长 void setup() { Serial.begin(9600); } void loop() { // 读取电位器值并映射为0-180度的角度 c = analogRead(Pin); c = map(c, 0, 1023, 0, 180); // 将角度转换为弧度后计算余弦值 c = cos(radians(c)); // 计算中间值d:200*(1 - cosθ) d = b - (b * c); // 计算平方根得到最终结果 e = sqrt(d); // 打印结果,保留两位小数更直观 Serial.print("最终边长e:"); Serial.println(e, 2); delay(100); // 加个小延迟避免串口输出太频繁 }
代码说明:
- 把所有参与浮点运算的变量都改成
float,确保计算过程中不会丢失精度; - 用
radians(c)把0-180的角度值转换成cos()需要的弧度值; - 补全了所有缺失的分号,修正语法错误;
- 增加了
Serial.println(e, 2)来保留两位小数,输出更清晰; - 加了
delay(100)避免串口刷屏。
测试一下的话,当角度是50度时(cos(50°)≈0.6428),d=200*(1-0.6428)=71.44,e=√71.44≈8.45,和你给出的例子逻辑一致。
内容的提问来源于stack exchange,提问作者Kavista_




