2012-11-12 4 views
1

내가 뭘하려고 오전 매우 간단 아직 결과가 오류와 함께 제공 :목표 C 부동 소수점 곱셈 부정확성

float x = 423.36; 
    NSLog(@"%f", x); 
    NSLog(@"%.2f", x*17719); 

결과 :

2012-11-12 11:19:02.096 test[2917:907] 423.359985 
2012-11-12 11:19:02.098 test[2917:907] 7501515.50 
  • 첫 번째 질문 : 처음에 NSLog 소수 부분이 변경되고 있습니다. 어떻게 그대로 둘 수 있습니까?
  • 두 번째 질문 : 십진수가 변경되면 곱셈 프로세스가 부정 확한 결과를 초래합니다.

계산기로 계산할 때 나는 7501515.84를 얻습니다. 이것이 내 앱에서 얻고 자하는 것입니다.

아이디어가 있으십니까? 미리 감사드립니다. Roy.

답변

2

모두가 부정확하므로 사용하지 마십시오. 두 배 사용

+0

감사합니다! 그게 효과가 있었어! –

+0

이것은 단지 문제를 지연시키는 것입니다.'x'를 double로 변환 한 후에'NSLog (@ "%. 100f", x)'를 시도하십시오. 소수점 이하 약 14 자리에서 같은 종류의 오류가 발생합니다. – Tim

+0

@tim 어떤 점에서는 double이 너무 비싸지 만 주어진 예제의 경우 원시 타입 대신 NSDecimalNumber _class_를 사용하는 것은 'sledge-hammer를 사용하여 너트를 깨뜨리는 것'과 같습니다. –

3
  1. 진수 변경됩니다 float정확하게 임의의 숫자를 나타낼 수 있기 때문이다. 플로트에는 사용자가 사용할 수있는 정밀도가 한정되어 있으므로 발견 한 이유를 신중히 고려해야합니다. 이러한 숫자는 경고없이 변경 될 수 있습니다.

  2. 이것은 정말로 질문이 아니지만 최선을 다할 것입니다. 당신이하고자하는 것은 임의의 (또는 적어도 더 높은) 정밀 소수점 수를 나타내는 방법을 찾는 것이라고 생각합니다. 네 수학에. 운좋게도 iOS SDK에는 이라는 응답이 있습니다. mantissa * 10^exp으로 표현할 수있는 숫자를 처리 할 수 ​​있습니다. mantissa은 최대 38 자리입니다. 해당 클래스 참조를 살펴보고 기존 수학을 이식 할 수 있는지 확인하십시오. 당신이 그것에있는 동안

, 이것은 당신이 발견 한 것과 같은 문제를 다루는 The Floating Point Guide을 통해 읽을 수있는 좋은 시간이 될 것입니다.

+0

나는 오버 헤드의 작은 비트처럼 보입니다. 나는 말해야 만합니다. –

관련 문제