Arduino UNO 上的常量太大

Too large const on Arduino UNO

我正在尝试在 Arduino UNO 上执行算法,它需要 const table 和一些较大的数字,有时,我会得到溢出值。这个号码就是这种情况: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() 包含以下 pre-condition 个测试:

  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位整数。

可能令人担忧的是评论 "constant determined empirically",它暗示这些值是通过反复试验而不是对数学的理解得出的!人们不得不想知道为什么这些值不是根据 INT_UMAX.

定义的

有一个提议"fix"描述了here,但它至少不会起作用,因为它将整数abs()函数应用到double参数number,只有当整数部分小于更严格的 MAX_INT 时才有效。作者已将 link 发布到一个 zip 文件,其中包含一个看起来更有可能工作的修复程序(至少有测试的证据!)。