Arduino UNO上的const太大

斯诺布·道格

我正在尝试在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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章