在Arduino Uno上,我的double变量的输出值不正确

时间:2016-06-10 23:37:34

标签: c arduino

我使用此代码测试打印双变量时输出是否正确显示:

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语言。

我的代码有什么问题?

1 个答案:

答案 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