전체 글 725

C# 언어에서 큰 부동소수점수(native double) 의 정확도

정수부의 자리수가 조금 큰 부동소수점수(64비트 double 포맷의 수)를 십진수 표현으로 출력해 보았습니다. 십진수로 표현하면 유효자리수 개수가 약 14~15개 정도인데, Java 언어로는 유효수자 개수를 17개로 자르고 그 뒤를 모두 0으로 출력하였지만, C# 언어로는 유효수자 아래 부분을 15개로 자르고 그 뒤를 모두 0으로 출력합니다. Pyhon 은 C/C++ 의 경우 처럼 유효수자 아래 부분을 0으로 채우지 않습니다. 물론 Java, C#, Python, C, C++ 어느 프로그램 언어든 십진수로 표현할 때 자르는 방법이나 유효수자 아래 부분을 채우는 방법은 다르지만, 덧셈, 뺄셈, 곱셈, 나누셈, 기타 등등에서 유효수자 아래부분의 처리 결과는 대동소이합니다. // Filename: Test_O..

프로그래밍/C# 2023.03.19

Python 언어에서 큰 부동소수점수(native double) 의 정확도

정수부의 자리수가 조금 큰 부동소수점수(64비트 double 포맷의 수)를 십진수 표현으로 출력해 보았습니다. 십진수로 표현하면 유효자리수 개수가 약 14~15개 정도인데, Java 언어로는 유효수자 개수를 17개로 자르고 그 뒤를 모두 0으로 출력하였고, C# 언어로는 유효수자 개수를 15개로 자르고 그 뒤를 모두 0으로 출력하였지만, Python 언어로는 유효수자 아래 부분을 자르지 않고 모두 츨력합니다. Pyhon 은 C/C++ 의 경우와 비슷합니다. 물론 Java, C#, Python, C, C++ 어느 프로그램 언어든 십진수로 표현할 때 자르는 방법이나 유효수자 아래 부분을 채우는 방법은 다르지만, 덧셈, 뺄셈, 곱셈, 나누셈, 기타 등등에서 유효수자 아래부분의 처리 결과는 대동소이합니다. # ..

Java 언어에서 큰 부동소수점수(native double)의 정확도

정수부의 자리수가 조금 큰 부동소수점수(64비트 double 포맷의 수)를 십진수 표현으로 출력해 보았습니다. 십진수로 표현하면 유효자리수 개수가 약 14~15개 정도인데, 17개로 자르고 그 뒤는 모두 0으로 출력합니다. C# 의 것과 비슷하지만 자르는 유효수자 개수가 다릅니다. Pyhon 이나 C/C++ 의 경우는 자르지 않고 소수점 위 부분을 모두 출력합니다. 물론 Java, C#, Python, C, C++ 어느 프로그램 언어든 십진수로 표현할 때 자르는 방법이나 유효수자 아래 부분을 채우는 방법은 다르지만, 덧셈, 뺄셈, 곱셈, 나누셈, 기타 등등에서 유효수자 아래부분의 처리 결과는 대동소이합니다. // Filename: Test_Of_Native_Double_Precison_001.java /..

Python의 math.floor() 함수에 대한 문제점(?) 고찰

10**100 을 7로 나누고 다시 7을 곱해 보았습니다. math.floor() 함수는 유효숫자의 개수 때문에 오차가 좀(?) 많네요. (float 인스턴스).as_integer_ratio() 메서드로도 확인해 보았습니다. >>> import math >>> help(math.floor) Help on built-in function floor in module math: floor(x, /) Return the floor of x as an Integral. This is the largest integer >> math.floor(1.0/7*1.0E100)*7 999999999999999991619529956938304660342807021100541805948047267623039861569382..

0.1 + 0.2 의 계산 결과가 0.3 이 되게 하기

어떤 프로그램 언어를 쓰든 0.1 + 0.2 ≠ 0.3 이 되는 것이 당연(?)합니다. 또한 1.0/(0.1 + 0.2 - 0.3) ≠ ∞ 이 되는 것도 당연(?)합니다. >>> 0.1 + 0.2 - 0.3 5.551115123125783e-17 >>> 0.1 + 0.2 - 0.3 > 1.0E-17 True >>> 0.1 + 0.2 - 0.3 > 1.0/10E17 True 0.1 + 0.2 - 0.3 이 1.0E-17 즉 0.000000000000000001 보다 크다고 합니다. 이래 가지고서는 부동소수점수의 계산 결과를 어디 까지 믿을 수 있는지 의문입니다. (보통으로는 배정밀도 부동소수점수는 유효수자 개수가 14개~15개 정도입니다.) 다행히 Python 의 fractions 모듈과 decimal 모..

부동소수점수의 소수점 아래에 홑 따옴표 문자 ' 붙여서 가독성 높이기

부동소수점수에 '를 붙이면 가독성이 좋아 실수를 덜 합니다. 아래의 소스는 MSVC 와 g++ 로 잘 컴파일되고 동일한 실행 결과를 얻습니다. // Filename: test_cpp_literal.cpp // // Compile: cl /utf-8 /EHsc test_cpp_literal.cpp // Execute: test_cpp_literal // // Or // // Compile: g++ -o test_cpp_literal test_cpp_literal.cpp // Execute:./test_cpp_literal // // Output: // pie = // 3.14159 // 3.14159 // 3.141593 // 3.141593e+00 // // pie = // 3.141593 // 3.14..

프로그래밍/C++ 2023.01.03

분수 계산 라이브러리 FractionLib 를 소개합니다.

먼저 파이썬 인터프리터를 실행하여 0.3 - 0.2 - 0.1 의 계산 결과를 알아 보았습니다. >>> 0.3 - 0.2 - 0.1 -2.7755575615628914e-17 계산 결과가 왜 0이 아닌 엉뚱한 값 -2.7755575615628914e-17 이 될까요? IEEE754 에 대해서는 관련되는 두 문서 [1] Double-precision floating-point format [2] Floating Point Arithmetic: Issues and Limitations 를 참고하기 바랍니다. NET Framework 4.6.x 이상에서 사용가능한 NET용 분수 계산 라이브러리를 소개합니다. (소스 수정 없이 NET Core 5.0 이상에서도 사용 가능합니다.) (Mac OS 에서도 Fract..

프로그래밍/C# 2022.07.25

맥 OS X에 gmplib 6.2.1 설치하고 g++로 설치 테스트하기

gmplib 의 현재 최신 릴리즈는 2020년 11월 14일에 출시된 gmplib 6.2.1 이다. 우선 이곳에서 압축 파일을 하나 다운로드한다. 여기서는 gmp-6.2.1.tar.xz 을 다운로드한 것으로 간주하고 설치 과정을 소개한다. 우선 tar 명령으로 다운로드한 파일의 압축을 해제한다. (아래에서 $ 는 쉘 프롬프트이므로 입력하지 않아먀 한다.) $ tar Jxvf gmp-6.2.1.tar.gz 위 명령에 의하여 현제 폴더에 gmp-6.2.1 이라는 폴더가 생기면서 압축된 것들이 이 폴더 아래에 해제된다. 이제 cd 명령으로 그 하위 폴더로 이동한다. $ cd gmp-6.2.1 configure 명령으로 설치하기 전 설정을 한다. 여기서 옵션 --enable-cxx 는 #include 구문으로 ..

프로그래밍/C++ 2022.03.19

0.3 - 0.2 - 0.1 != 0.0

0.3 - 0.2 - 0.1 == 0.0 0.3 - 0.2 - 0.1 != 0.0 0.3 - 0.2 - 0.1 -eq 0.0 0.3 - 0.2 - 0.1 -ne 0.0 PowerShell 뿐만 아니라 배정말도 부동소수점수(IEEE754-1987 포맷) 계산에서는 십진수로 유효수자(sifnificant digits) 개수가 약 15개 밖에 안되므로 모든 소수점수를 근사값으로 계산한다. (mantissa 가 52bit, 부호가 1bit, 지수부가 11bit 로 총 64bit 즉, 8byte) Byte 7 Byte 6 Byte 5 Byte 4 Byte 3 Byte 2 Byte 1 Byte 0 Byte 0 -------- -------- -------- -------- -------- -------- -----..

MSYS2 에서 C 언어의 printf(...) 가 제대로 출력하지 못할 때...

아래의 단순한 코드로 작성되어 gcc 로 컴파일된 실행파일의 콘솔 출력이 비정상인 경우.... #include int main(void) { int i; for (i = 0; i < 5; i++) { printf("abcd %d\r\n",i); Sleep(1000); } return 0; } 첫째 해결 방법: 아래의 수정된 코드 처럼 모든 printf.(...); 구문 뒤에 fflush(strout); 를 추가한다. #include int main(void) { int i; for (i = 0; i < 5; i++) { printf("abcd %d\r\n",i); fflush(stdout); // 모든 printf(...); 구문 뒤에 이를 추가한다. Sleep(1000); } return 0; } 둘째..

프로그래밍/C 2022.01.08