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 文件,其中包含一个看起来更有可能工作的修复程序(至少有测试的证据!)。
我正在尝试在 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 文件,其中包含一个看起来更有可能工作的修复程序(至少有测试的证据!)。