Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 乘法返回的值不正确_C++_Arduino - Fatal编程技术网

C++ 乘法返回的值不正确

C++ 乘法返回的值不正确,c++,arduino,C++,Arduino,我正在为正在进行的Arduino项目编写一些代码,乘法返回的值不正确,我不知道为什么 String calculateShutterSpeed(float fs, int i, int l){ float fstop = fs; int iso = i; int lux = l; float c = 1.00; float shutterspeedTop = 0; double shutterspeedBottom = 0; shutterspeedTop = pow(fs, 2)*c; sh

我正在为正在进行的Arduino项目编写一些代码,乘法返回的值不正确,我不知道为什么

String calculateShutterSpeed(float fs, int i, int l){
float fstop = fs;
int iso = i;
int lux = l;
float c = 1.00;
float shutterspeedTop = 0;
double shutterspeedBottom = 0;

shutterspeedTop = pow(fs, 2)*c;
shutterspeedBottom = lux*iso;

shutterspeedBottom = shutterspeedBottom/shutterspeedTop;

给出错误的代码是我将lux乘以iso的那一行,在某些情况下(使用较小的数字),它可以正常工作,但一旦我使用较大的数字,它就开始给我错误的数字,例如lux为4833,iso为200,将给我-16440的结果。

一个
int
类型可以将数字保持到一个极限。 在你的例子中,这似乎是2^16=65536个数字,这意味着你可以有范围[-3276832767]的数字。 您可以使用
long
类型来解决此问题

简要说明:
short
=2字节
long
=4字节
int
=2字节或4字节(取决于体系结构)


感谢ChiefTwoPencils指出模糊性

一个
int
类型可以将数字保存到一个极限。 在你的例子中,这似乎是2^16=65536个数字,这意味着你可以有范围[-3276832767]的数字。 您可以使用
long
类型来解决此问题

简要说明:
short
=2字节
long
=4字节
int
=2字节或4字节(取决于体系结构)


感谢ChiefTwoPencils指出模糊性

根据您拥有的电路板,将使用两个或四个字节

将两个2字节整数相乘将生成另一个2字节整数,如果该范围过大,则为;这就是你看到的行为


您必须转到a或a。

取决于您所用的板,将是两个或四个字节

将两个2字节整数相乘将生成另一个2字节整数,如果该范围过大,则为;这就是你看到的行为


您必须转到a或a。

Arduino上的
int
范围为-32768到32767。简单的解决方法是将
iso
lux
int
更改为
double
。为什么有这么多括号?Arduino上
int
的范围是-32768到32767。简单的解决方法是将
iso
lux
int
更改为
double
。为什么有这么多括号?感谢您的帮助,我尝试更改为double,它解决了我的问题,适用于更大的范围,但对于较大的数字(lux值为10000)仍然会中断。还有其他方法可以解决这个问题吗?如果你想要任意精度的整数,你需要实现“大数字”或使用bignum库。哎呀,经过一些调查后意识到新问题不在大小上,所以非常感谢你的帮助!感谢您的帮助,我尝试更改为双精度,它解决了我的问题,它适用于更大的范围,但对于更大的数字(勒克斯值为10000)它仍然会中断。还有其他方法可以解决这个问题吗?如果你想要任意精度的整数,你需要实现“大数字”或使用bignum库。哎呀,经过一些调查后意识到新问题不在大小上,所以非常感谢你的帮助!建议对32位值使用固定宽度类型,例如
uint32\u t
。建议对32位值使用固定宽度类型,例如
uint32\u t