我使用此代码测试打印双变量时输出是否正确显示:
double t = (0.8*0.8*(10^5)*599*(10^-6)*1388.888889)/(287*(25+273)*14.7*3*(10^-3)*4);
Serial.println(t);
但我在串口上的输出是4.03而不是3.52
我正在使用Arduino UNO和Arduino C语言。
我的代码有什么问题?
答案 0 :(得分:0)
我怎么能解决这个问题
在C,C ++,JavaScript,Java中:
数字10 ^ 5必须在程序中表示为1e5
和数字10 ^ -6为1e-6
使用'^'强制程序执行逐位操作10 ^ 5 =(10)^(5)
请参阅:https://msdn.microsoft.com/en-us/library/3akey979.aspx
<强>解决方案强>
更改
double t = (0.8*0.8*(10^5)*599*(10^-6)*1388.888889)/(287*(25+273)*14.7*3*(10^-3)*4);
要:
double t = (0.8*0.8*(1e5)*599*(1e-6)*1388.888889)/(287*(25+273)*14.7*3*(1e-3)*4);
现在你得到了正确的结果:
t = 3.5292104651726235
arduino上的int范围非常有限:32767到-32768。 长期是2147483647到-2147483648
避免混合int和double以避免舍入错误。
仅使用double或您可以使用强制转换:
double d = (double)(0.8*0.8*(1e5)*(double)599*(1e-6)*1388.888889)/(((double)287)*((double)(25+273))*((14.7*((double)3)))*(1e-3)*(double)4);
关于Arduino的注释
Serial.print(1.23456); //gives "1.23"
要获得更多数字,请将双变量转换为字符串并打印字符串。
示例:
double num = (double)(0.8*0.8*(1e5)*(double)599*(1e-6)*1388.888889)/(((double)287)*((double)(25+273))*((14.7*((double)3)))*(1e-3)*(double)4);
char output[50];
snprintf(output, 50, "%f", num);
Serial.print(output); // should give you at least 3.529210