2017-02-03 1 views
2

Arduino UNO에서 알고리즘을 실행하려고하면 일부 큰 숫자가있는 const 테이블이 필요하며 때로는 오버플로 값이 발생합니다. 이 숫자의 경우입니다 : 628331966747.0Arduino에 너무 큰 const UNO

좋아요, 이것은 큰 것이지만, 그 유형은 최대가 3.4028235e38 인 float (32 비트)입니다. 이론적으로는 효과가 있습니까?

내가 어떻게해야합니까? 해결책을 알고 있습니까?

EDIT는 :의 Arduino UNO에서 두 수레 동일한 유형 (32 비트) 여기서

오류로 이어지는 코드 exaclty 같습니다

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이 설명되어 있지만 작동하지 않습니다 적어도 그것은 정수 부분이 MAX_INT 짝수 더 제한보다 작은 경우에만 작동합니다 double 매개 변수 number에 정수 abs() 기능을 적용하기 때문에 . 작성자는 작동 가능성이 높은 수정본을 포함하는 zip 파일에 대한 링크를 게시했습니다 (적어도 테스트의 증거가 있습니다!).

+0

Upvoted. 나는 제안 된 'fix'가 * github *에서 바로 업데이트되었다고 덧붙이고 싶습니다. –