2017-02-03 95 views
2

我试图在Arduino UNO上执行一个算法,它需要一些大数字的const表,有时我会得到溢出值。这个数字是这样的:628331966747.0Arduino UNO上的const太大const

好的,这是一个很大的,但是它的类型是float(32位),其中最大值是3.4028235e38。所以理论上它应该起作用?

我能对此做些什么?你知道一个解决方案吗?

编辑:在Arduino的UNO,双是exaclty漂浮同一类型(32个比特)

这里是导致该错误的代码:

float A; 

void setup() { 
    A = 628331966747.0; 
    Serial.begin(9600); 
} 

void loop() { 
    Serial.println(A); 
    delay(1000); 
} 

其打印“OVF,OVF, ...,ovf“

+0

什么是错误? – GManNickG

+1

由于浮点数的存储方式,FWIW'628331966747'不能精确地存储为浮点数。在32位浮点数中最接近的表示形式是'628331970560'。然而,双倍将适合罚款。 – Thebluefish

+0

@GManNickG下面的代码我发布我收到“ovf,ovf,ovf ...”对我来说它应该返回类似于:6.283319e011,不是? –

回答

3

常数本身没有什么问题(除了相当乐观的有效数字外),但问题在于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文件,该修复看起来更有可能工作(至少有测试证据证明!)。

+0

Upvoted。我想补充说的是,刚才提出的'fix'已经在* github *上更新了。 –