나는 다음과 같은 코드를 실행하면, 출력은 정확하게 숫자 2 500 진수있다.
(우분투의 g ++ 5.3.1)
#include<iostream>
#include<cmath>
using namespace std;
int main(){
cout.precision(0);
cout << fixed << pow(2.0,500.0);
return 0;
}
C ++이이 부동 소수점 숫자를 그렇게 높은 정밀도로 십진 문자열로 어떻게 변환했는지 궁금합니다.
나는이 것을 알고 500 정확하게 IEEE 754 형식으로 제공 될 수있다. 하지만 생각 mod 10
과 divided by 10
부동 소수점에 정밀 손실이 발생할 수 있습니다. 변환이 진행될 때 어떤 알고리즘이 사용됩니까?
예, 2 500에 대한 정확한 배정 밀도 부동 소수점 표현이 있습니다. pow(2.0,500.0)
하지만이 값이 생성 된다고 가정해서는 안됩니다 . 함수의 정확성에 대한 보장은 없으며 수학적 결과도 완벽하게 표현할 수 있었지만 생성하지 않음으로 인해 발생한 SO 질문 을 pow
찾을 수 있습니다.pow(10.0, 2.0)
100.0
그러나 어쨌든 귀하의 질문에 대답하기 위해 부동 소수점 이진 표현에서 10 진수로의 변환은 일반적으로 부동 소수점 연산에 의존하지 않으며 실제로 최종 결과의 의도 된 정확도에 비해 너무 정확하지 않습니다. 일반적으로 정확한 변환을 위해서는 큰 정수 산술에 의존 해야합니다 . 2의 경우는 500 예를 들어, 순진 알고리즘은 반복적으로 바이너리로 작성된 큰 정수 분할하는 것입니다 1000…<500 zeroes in total>…
열으로합니다.
부동 소수점 산술을 사용할 수있는 경우가 있습니다. 예를 들어 10에서 10 23 까지의 거듭 제곱이 IEEE 754 배정 밀도로 정확하게 표현 된다는 사실을 활용합니다 . 그러나 이진 부동 소수점과 10 진수 부동 소수점 사이의 올바른 반올림 변환에는 항상 일반적으로 큰 정수 산술이 필요하며, 이는 특히 1.0에서 멀리 떨어져 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다