정수부의 자리수가 조금 큰 부동소수점수(64비트 double 포맷의 수)를 십진수 표현으로 출력해 보았습니다.
십진수로 표현하면 유효자리수 개수가 약 14~15개 정도인데,
Java 언어와 C# 언어에서는 유효수자를 적당한개수(17개나 15개)로 자르고
그 뒤를 모두 0으로 출력하였지만,
C 언어에서는 유효수자 아래 부분을 자르지 않고 모두 출력합니다.
Pyhon 언어에서도 C 언어 처럼 유효수자 아래 부분을 0으로 채우지 않습니다.
물론 Java, C#, Python, C, C++ 어느 프로그램 언어든
십진수로 표현할 때 자르는 방법이나 유효수자 아래 부분을 채우는 방법은 다르지만,
덧셈, 뺄셈, 곱셈, 나누셈, 기타 등등에서 유효수자 아래부분의 처리 결과는 대동소이합니다.
C 언어에서 긴 자리 정수를 처리하기 위해
gmplib 를 Visual C/C++ 용으로 개조한 mpir 라이브러리를 사용하였습니다.
// Filename: Test_Of_Native_Double_01.c
//
//
// Compile: cl /utf-8 /EHsc /I. Test_Of_Native_Double_01.c mpir.lib
// Execute: Test_Of_Native_Double_01
// Output:
// pow(2, 128) = 340282366920938463463374607431768211456.000000
// pow(2, 128) = 340282366920938463463374607431768211456
// After mpz_pow(r, 2, 128), we get r = 340282366920938463463374607431768211456
//
//
// ------------------------------------------------------
// 출처: https://scripting.tistory.com/
// ------------------------------------------------------
#include <stdio.h>
#include <math.h>
#include <mpir.h>
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);
}
int main(int argc, const char *argv[])
{
test_01();
printf("\n");
}
'프로그래밍 > C' 카테고리의 다른 글
MSYS2 에서 C 언어의 printf(...) 가 제대로 출력하지 못할 때... (0) | 2022.01.08 |
---|---|
Lanczos 계수를 이용하여 Gamma 함수값 구하기 (0) | 2021.12.08 |
MPFR 라이브러리를 이용하여 Gamma 함수값 계산하기 (0) | 2021.01.28 |
cygwin 의 gcc 로 UTF-8 한글 처리하는 간단한 예제 (0) | 2014.04.13 |
cygwin/mingw 의 gcc 로 utf-8 한글 처리하기 (0) | 2014.04.02 |