arduino-uno - Arduino UNO 上的常量太大

标签 arduino-uno

我正在尝试在 Arduino UNO 上执行算法,它需要包含一些大数字的常量表,有时,我会得到溢出值。这个数字就是这种情况: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 定义的。

有一个建议的“修复”描述 here ,但它至少不会起作用,因为它将整数 abs() 函数应用于 double 参数 number,它只有在整数部分小于限制性更强的 MAX_INT。作者发布了一个 zip 文件的链接,其中包含一个看起来更有效的修复程序(至少有测试证据!)。

关于arduino-uno - Arduino UNO 上的常量太大,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42034906/

相关文章:

mysql - 如何使用 SIM808GSM/GPRS 扩展板将传感器数据从 Arduino UNO 发送到 MySQL 数据库

arduino - 带有 ESP8266 的 RC522 不工作 Arduino uno

arduino - 12 MHz 晶振速度

java - 处理白屏?

audio - 从 PyAudio 获取音量以在 Arduino 中使用

c++ - 获取指定char数组arduino的前n个元素

c++ - Arduino TFT 触摸板 : draw in loop

http - ESP8266 GET 请求不工作

c++ - Arduino——关于数据类型

arduino - 无法通过 Arduino Duemilanove 上的 32 伺服 Controller 控制 Helm 机