고객에게 부동 소수점 정밀도 설명 [닫기]


23

고객에게 부동 소수점 반올림 문제를 설명하는 가장 좋은 방법은 무엇입니까 ?

알아

http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html

C ++ FAQ 및 개발자 및 과학자를 대상으로 한 다양한 기타 페이지의 항목뿐만 아니라 수학 또는 과학적 배경이 제한된 "일반적인"고객을 대상으로하는 웹 페이지, 기사 또는 설명이 있습니까? (위의 참고 문헌은 평평합니다).

잘 알려져 있고 잘 알려진 기관이나 회사에서 유지 관리하거나 제공 한 경우, 일부 사용자가 경험했듯이 자신을 설명하는 것이 약간 복잡 할 수 있다는 점에서 더 좋습니다.


1
난 귀찮게하지 않을 것입니다 ...
존 샤프트

1
이것은 정말 환상적인 질문입니다. 가능하면 +10입니다. 개발자들에게 빈번한 문제.
코디 그레이

2
그것은 세부적인 문제가 아니며, 왜 소수점 이하 두 자릿수의 숫자를 추가하는지, 왜 6이 아닌 5.9999999로 끝나는 지, 왜 결과가 "명백한"일 때 반올림 정밀도를 지정해야하는지에 대한 답입니다. t는 두 자리 이상의 십진수입니다. 또는 때로는 2 빼기 2가 항상 0이 아니며 그렇게하는 동안 대나무 바보처럼 보이지 않는 이유는 무엇입니까?
Eric Grange

9
@Eric 그레인은 : 고객이 버그로 그 정밀도 문제를 고려하면, 다음, 그것은 이다 버그 당신은 (아마도 플로트를 사용하지 않음으로써) 문제를 해결할 수있는 방법을 찾아야한다. 그들은이 정밀성 문제가 어디서 오는지는 신경 쓰지 않습니다. 소프트웨어 작동 방식에 대해서는 신경 쓰지 않습니다. 그들은 단지 그것이 작동하기를 원합니다.
David

3
@Eric : 부동 소수점의 사용 이다 구현 세부. 나는 질문에 설명 된 것을 요구하지 않는 내 질문을 반복하고, 분명히 명확하지 않은 것 (사과) : 문맥은 무엇이며, 왜 고객과 부동 소수점 사용을 논의하고 있습니까?
Tom Anderson

답변:


8

이것을 설명하는 간단한 방법을 보여줍니다 . x숫자로 나누고 같은 숫자를 곱하면 x다시 다시 돌아와야한다는 점을 논의하십시오 . 고객은 항상 그런 경우에 동의해야합니다. 그런 다음 (100 / 3) * 3계산기 에서 이전 을 수행하십시오 . 대부분의 사람들이 명백히 간단한 수학이 "분할"하는 것을 보았을 때 정확도가 중요한 부동 소수점 수의 위험을 '얻는'경향이 있습니다 (직관적이지만 직관적 임에도 불구하고) 당신이 가리키는 기사가 저수준이 아니라).

불행히도 오늘날 대부분의 반 정도 계산기 (확실히 내가 본 모든 과학 계산기와 몇 가지 기본 계산기) 가이를 처리 할 수 ​​있습니다. 표시하고 반올림 할 수있는 것보다 추가 숫자를 저장한다고 가정합니다. 고객 앞에서 계산기를 사용하기 전에 얼마나 영리한지 확인하십시오.


1
예, 거의 모든 계산기에 최소 2 개의 추가 숫자가 저장되므로 믹스에 약간의 곱셈을 추가해야합니다. 제곱근은 더 적은 작업이 필요하지만 제곱근은 이미 일반 고객의 일상 영역을 벗어납니다.
Eric Grange

2
@Scott 나는 여기에 몇 가지 계산기를 사용해 보았지만 (100/3) * 3에는 문제가 없었으며 (100/3) * 3-100에는 문제가 없었습니다 .... Excel도 제대로 작동합니다.
Eric Grange

9
완벽하게 제한된 정밀도를 가진 돈을 예로 들어보십시오. 1 달러를 나누면 모든 사람이 33 센트를 얻고 반올림에서 1 페니가 손실된다고 설명합니다. 누구나 그것에 관련 될 수 있습니다.
잉카

4
계산기를 귀찮게하지 마십시오. 3 자리의 유효 숫자를 유지하면서 1을 3으로 나눕니다.
David Thornley

5
@omegacentauri 설명이 도움이된다고 생각하면 고객과 자주 이야기하지 않는 것 같습니다.
jhocking

5

나는 지름길이 없다고 생각합니다. 다음 중 하나를 수행해야합니다.

  • 부동 소수점이 무엇이며 어떻게 작동하는지 이해합니다.

또는 너무 많은 정보가 필요한 경우 다음을 수행해야합니다.

  • 컴퓨터가 정확한 숫자 결과를 제공하지 않는다는 점에 동의하십시오.

부동 소수점 문제가 유리수에도 적용 되더라도 비합리적인 숫자가있는 예가 도움이 될 수 있습니다 sqrt(2) ~ 1.414. 그런 다음 1.414^2 = 1.999396. 아무리 많은 자릿수를 사용하더라도 원래대로 돌아 가지 않습니다 2. 네, 유효 자릿수 4 자리가 맞을 수도 있지만 이런 종류의 "반올림 오류"가 누적 될 때 어떤 일이 발생하는지 고려하십시오. 그것이 진짜 위험이있는 곳입니다.


2
나는 개인적으로 알고 이해하지만 일부 사람들에게는 "부동 소수점"이 이미 외계인 용어이므로 머리에서 바로 계산할 수있는 것, 비싼 컴퓨터 및 소프트웨어가 올바르게 이해하는 데 어려움을 겪고 있음을 설명하기 위해 수학적 또는 과학적 설명 이상이 필요합니다 ;) 또한 제곱근은 일반 고객의 일상 영역 밖에 있습니다.
Eric Grange

5

먼저, 그들이 불평하는 것을 결정하십시오. 올바른 소수점 이하 자릿수와 올바른 반올림 규칙을 사용하여 금융 거래를 정확하게 수행해야합니다. 이는 일반적으로 정수 단위의 정수를 유지하고 산술이 올바르게 수행되도록하는 것을 의미합니다.

또는 과다 정확한 디스플레이에 대해 불만을 표시 할 수 있으며 유효 자릿수 출력 수를 줄이는 것이 필요한 것일 수도 있습니다.

일반적으로 숫자의 경우 항상 x * 3이 10 인 3 자리 10 진수 x를 생각해 낼 수 있습니다. 기본 원리를 보여줍니다.

남아있는 두 가지 문제가 있습니다. 하나는 특정 숫자는 정확히 10 진수로 표현할 수 있지만 2 진 (3.15)은 아닙니다. 그것은 기술이 아닌 사람들에게 설명하기 어려울 것이며, 가장 좋은 방법은 표시하기에 충분한 숫자를 제공하지 않으면 서 피하는 것입니다. 다른 하나는 컴퓨터 산술이 항상 정확한 것은 아니며 십진 산술이 항상 정확한 것은 아니라는 것을 알기에 충분히 아는 고객입니다. 나는 그 중 몇 가지에 대해 논쟁을 벌였으며보고하는 데 유용한 정보가 없습니다.


3

컴퓨터의 부동 소수점 숫자는 이진수를 사용하므로 1, 10, 100 및 10, 100 열을 가진 숫자 시스템을 갖는 것처럼 컴퓨터의 부동 소수점 숫자는 실제로 1, 2, 4, 반, 1/4, 여덟 번째 열. 고객이 피트 / 인치에 익숙한 경우 일반적으로 측정에 2 인치를 사용하는 방법을 상기시킵니다.

이제 10 센트를 반, 4 분의 1, 1/8 달러의 조합으로 저장하십시오. 그것은 작동하지 않습니다 :

.00011001100110011… . . ( 무한 반복 )

표준 영국식 측정 테이프를 사용하여 1/10 인치를 측정하는 것과 동일합니다. 당신은 그것을 정확하게 할 수 없습니다. X와 Y는 정수이고 Y는 2의 거듭 제곱으로 1/10을 X / Y로 표시하지 않습니다.

그렇기 때문에 각 10 진수 를 저장하기 위해 4 비트를 사용하는 10 진수 데이터 유형이 있으므로 기본 10으로 돌아갑니다. 트레이드 오프는 공간과 성능 (내가 읽은 것에서 약 100 %의 성능 히트)에 있습니다.


1

은행 계좌에 4.4423425908459032890413 ... 달러 ($ 4.44 또는 $ 4.45, 중간에 없음)를 보유 할 수없는 것처럼 컴퓨터는 임의의 정밀도로 쉽게 숫자를 저장할 수 없다고 말합니다. 저장이 불완전하면 계산이 불완전합니다.

(약간 부정 행위이지만 문제가 무엇인지에 대한 아이디어를 제공해야합니다.)


2
아아, 그 설명은 작동하지 않습니다. 정밀도 문제는 모두 두 자릿수의 정밀도로 시작하는 숫자를 합할 때 발생할 수 있기 때문입니다.
Eric Grange

1
소수점 이하 두 자리 그렇습니다. 호기심 많은 고객이 구멍을 뚫을 것입니다. 그러나 당신은 이진 표현의 논의를 칠 수 - 그들은 ;-) 그것을 요구
quant_dev

글쎄, 이미 부동 소수점을 설명하려고 시도하면 IME는 즉시 당신이 그들을 죽이려고한다고 생각하기 시작합니다. 단순하고 이해할 수있는 용어로 또는 잘 알려진 기관이나 회사에서 온 경우 완화 될 수 있습니다. :)
Eric Grange

1
@ 에릭 수학은 어렵다, 야구를 가자 : P
quant_dev

1
가장 가까운 1/10 "또는 가장 가까운 밀리미터까지 측정하는 것이 더 정확한지 물어보십시오. 후자는 더 정확하지만 0.1"의 정확한 배수 인 물체는 또한 1mm의 정확한 배수가 아닙니다. 5 "의 정확한 배수 (정확히 127mm). 가장 가까운 0.1"로 측정 된 2 개의 2.54mm 물체의 크기를 추가하면 0.2 "의 결합 된 크기가 생성됩니다. 가장 가까운 밀리미터로 반올림 된 크기를 합하면 실제 크기는 5.08mm 여야합니다
supercat

1

2/3

그들에게 2로 3으로 나눈 정확한 답을 적어달라고 부탁
하십시오. 대답은 '영원히 계속됩니다'이므로 그 점을 지적 할 수 있습니다.

1/3을 사용하는 것도 효과가 있지만 2/3은 반올림을 제공하므로 약간 더 좋은 예일 수 있습니다 (예 : .6666667). .3333333은 잘릴 수있는 것처럼 보입니다.


0

계산을 수행 할 때 컴퓨터는 근사값을 사용하는 것이 훨씬 빠르기 때문에 일반적으로 근사값을 숫자로 사용합니다 (예 : 1000000.7을 사용하는 대신 1000000을 사용함). 문제는 근사값으로 계산을 수행 할 때 근사값을 다시 얻는다는 것입니다. 일반적으로 잘 작동하지만 때로는 예기치 않은 결과가 발생합니다.


나는 당신이 여기서 말하는 것을 정말로 이해하지 못합니다. "근사값을 사용하는 것이 훨씬 빠르기 때문에"? 때로는 정수 산술이 적어도 빠르며 정확합니다. 때로는 대안이 없습니다 (2의 제곱근을 인쇄하는 것과 같이).
David Thornley

컴퓨터가 왜 실제로 비이성적 인 숫자를 대표 할 수 없는지 또는 기본적으로 거대한 사물 체계의 숫자를 표현할 수없는 이유를 마케팅 담당자에게 설명해보십시오. 푸리에 시리즈가 귀엽습니다). 대략적인 것은 사람들이 이해할 수있는 단어입니다. 모든 숫자가 같지 않다는 것을 아는 사람의 관점에서 접근하고 있습니다.

0

일부 계산은 법적 규칙에 따라 수행됩니다. 예를 들어 독일의 과세 대상 연간 소득 € 79.245,18에 대해 얼마나 많은 소득세를 지불해야하는지 계산하려면 정답이 하나뿐입니다. 당신은 그것을 올바르게 얻거나 잘못합니다. 올바르게 이해하면 부동 소수점 산술이 어떻게 작동하는지 설명 할 필요가 없습니다. 잘못하면 부동 소수점 산술이 어떻게 작동하는지 설명 할 필요가 없으므로 깨진 코드를 수정해야합니다.

때로는 올바르지 않은 결과가 표시되는 경우가 있습니다. 예를 들어, 십진수 두 자리를 사용하여 US $ 13,297.46을 UK £로 변환 한 다음 해당 UK £ 금액을 US $로 다시 변환하면 US $ 13,297.46이 아니라 US $ 13,297.45 또는 US $ 13,297.47을 얻을 수 있습니다. 부동 소수점 산술과는 아무런 관련이 없습니다. 피할 수없는 문제이며 피할 수없는 이유를 더 잘 설명 할 수 있습니다. (UK £에서 US $로 변환 할 때 문제가 발생하지 않는 이유도 알아야합니다.)

올바르게 보이지 않는 다른 가능한 결과가 있습니다. 숫자를 백분율로 변환하면 백분율은 최대 100 %가되지만 그렇지 않을 수 있습니다. 소수점 이하 두 자리로 4 개의 백분율을 표시하면 4 개의 백분율이 99.99 % 또는 100.01 %가 될 수 있습니다. 부동 소수점 산술과 관련이 없습니다. 여전히 그 이유를 설명 할 수 있어야합니다.

다음으로 부주의 한 부동 소수점 산술을 사용하면 부적절한 결과가 발생하는 상황이 있습니다. 예를 들어, a + b + c는 일반적으로 b + c + a와 동일하지 않습니다. 그로 인해 문제가 발생하면 설명 할 내용이 없으며 문제가 해결 된 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.