我正在尝试在Arduino UNO上执行算法,它需要带有一些大数字的const表,有时,我会得到溢出值。这个电话就是这种情况:628331966747.0
好的,这是一个很大的变量,但其类型为float(32位),最大值为3.4028235e38。从理论上讲,它应该工作吗?
我该怎么办?您知道解决方案吗?
编辑:在Arduino UNO上,double等于浮动的相同类型(32位)
这是导致错误的代码:
float A;
void setup() {
A = 628331966747.0;
Serial.begin(9600);
}
void loop() {
Serial.println(A);
delay(1000);
}
它显示“ ovf,ovf,...,ovf”
常量本身没有什么问题(除了其相当大的有效数字),但问题在于Arduino的库支持实现了对浮点值的打印。Print::printFloat()
包含以下前提条件测试:
if (isnan(number)) return print("nan");
if (isinf(number)) return print("inf");
if (number > 4294967040.0) return print ("ovf"); // constant determined empirically
if (number <-4294967040.0) return print ("ovf"); // constant determined empirically
似乎是故意限制了可打印值的范围,以便大概减少复杂性和代码大小。后续代码揭示了原因:
// Extract the integer part of the number and print it
unsigned long int_part = (unsigned long)number;
double remainder = number - (double)int_part;
n += print(int_part);
过于简单的实现要求整数部分的绝对值本身就是32位整数。
令人担忧的事情可能是“根据经验确定的常数”这一评论,而是表明这些值是通过反复试验得出的,而不是对数学的理解!人们不得不怀疑为什么这些值没有用来定义INT_UMAX
。
有描述的提出的“修正”在这里,但它不会至少工作,因为它适用于整abs()
函数的double
参数number
,这只会工作,如果整数部分小于更加严格MAX_INT
。作者发布了一个指向zip文件的链接,该文件包含一个看起来更可能起作用的修复程序(有证据表明至少可以进行测试!)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句