정수부의 자리수가 조금 큰 부동소수점수(64비트 double 포맷의 수)를 십진수 표현으로 출력해 보았습니다.
십진수로 표현하면 유효자리수 개수가 약 14~15개 정도인데,
Java 언어와 C# 언어에서는 유효수자를 적당한 개수(17개나 15개)로 자르고
그 뒤를 모두 0으로 출력하였지만,
C++ 언어에서는 유효수자 아래 부분을 자르지 않고 모두 출력합니다.
Pyhon, Ruby 언어에서도 C/C++ 언어 처럼 유효수자 아래 부분을 0으로 채우지 않습니다.
물론 Java, C#, Python, C, C++ 어느 프로그램 언어든
십진수로 표현할 때 자르는 방법이나 유효수자 아래 부분을 채우는 방법은 다르지만,
덧셈, 뺄셈, 곱셈, 나누셈, 기타 등등에서 유효수자 아래부분의 처리 결과는 대동소이합니다.
C++ 언어에서 긴 자리 정수를 처리하기 위해
gmplib 를 Visual C/C++ 용으로 개조한 mpir 라이브러리를 사용하였습니다.
// Filename: Test_Of_Native_Double_CPP_01.cpp
//
//
// Compile: cl /utf-8 /EHsc /I. Test_Of_Native_Double_CPP_01.cpp mpir.lib mpirxx.lib
// Execute: Test_Of_Native_Double_CPP_01
// Output:
// pow(2, 128) = 340282366920938463463374607431768211456.000000
// pow(2, 128) = 340282366920938463463374607431768211456
// After mpz_pow(r, 2, 128), we get r = 340282366920938463463374607431768211456
// Let b = 18446744073709551616 = 0x10000000000000000
// Then we get b * b = 340282366920938463463374607431768211456 = 0x100000000000000000000000000000000
//
//
// ------------------------------------------------------
// 출처: https://scripting.tistory.com/
// ------------------------------------------------------
#include <cstdio>
#include <cmath>
#include <mpir.h>
#include <mpirxx.h>
#include <iostream>
using namespace std;
void test_01()
{
double y = pow(2, 128);
printf(" pow(2, 128) = %f\n", y);
printf(" pow(2, 128) = %.f\n", y);
mpz_t r, a;
mpz_init (r);
mpz_init_set_str(a, "2", 0);
mpz_pow_ui(r, a, 128);
gmp_printf("After mpz_pow(r, %Zd, 128), we get r = %Zd\n", a, r);
mpz_clear(r);
mpz_clear(a);
mpz_class b, c;
b = "0x10000000000000000";
c = b * b;
cout << "Let b = " << b << " = " << hex << showbase << b << dec << noshowbase << endl;
cout << "Then we get b * b = " << c << " = " << hex << showbase << c << dec << noshowbase << endl;
}
int main(int argc, const char *argv[])
{
test_01();
printf("\n");
}
'프로그래밍 > C++' 카테고리의 다른 글
부동소수점수의 소수점 아래에 홑 따옴표 문자 ' 붙여서 가독성 높이기 (0) | 2023.01.03 |
---|---|
맥 OS X에 gmplib 6.2.1 설치하고 g++로 설치 테스트하기 (0) | 2022.03.19 |
Boost Library를 이용하여 임의의 정밀도를 갖는 부동소수점수 계산하기 (0) | 2021.03.29 |
new 키워드로 생성된 배열의 크기 변경하여 재할당하기 (0) | 2021.02.24 |
utf8 인코딩을 이용한 다국어 hello world (0) | 2021.01.23 |