gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:07:28 26 4
gpt4 key购买 nike

我正在尝试在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com