방금 Lisp을 배우기 시작했고 합리적인 숫자를 많은 숫자가있는 10 진수로 표시하는 방법을 궁금해하고있었습니다.Lisp에서 장표를 긴 숫자 목록으로 표시하는 방법은 무엇입니까?
x가 합리적인 경우 (float x) 사용하면 약 8 자리 정도가 표시됩니다. 하지만 저는 수백 자리 숫자를 표시하고 싶습니다.
방금 Lisp을 배우기 시작했고 합리적인 숫자를 많은 숫자가있는 10 진수로 표시하는 방법을 궁금해하고있었습니다.Lisp에서 장표를 긴 숫자 목록으로 표시하는 방법은 무엇입니까?
x가 합리적인 경우 (float x) 사용하면 약 8 자리 정도가 표시됩니다. 하지만 저는 수백 자리 숫자를 표시하고 싶습니다.
기본적으로 긴 나누기를 수행하고 직접 숫자를 계산하는 알고리즘을 구현해야합니다. 수백 자리수의 십진수를 저장할 수있는 원시 데이터 유형은 없습니다.
Common Lisp의 구현 인 CLISP를 사용할 수 있습니다. 확장으로서 설정 가능한 정밀도의 부동 소수점을 제공합니다. 참조 : http://clisp.cons.org/beta/impnotes/num-concepts.html#lfd
또한 Maxima와 Axiom과 같은 시스템이 Common Lisp 위에 실행됩니다. 이것들은 또한 고정밀의 실수로 계산할 수 있습니다.
Common Lisp 표준은이를 제공하지 않습니다.
(format nil "~,100F" x)
이 원하는대로 구현 될 수 있습니다. 그러나 대부분이 첫 번째는 float로 변환 된 다음 정밀도를 잃는 숫자를 계산합니다.
나만의 프로그램을 작성하는 것은 그리 어렵지 않습니다. 아이디어는 소수점 앞뒤의 부분을 정수로 별도로 계산하는 것입니다.
(defun number->string-with-fixed-decimal-places (x width &optional stream)
"Print an approximation of <x> with <width> digits after the decimal point."
(multiple-value-bind (int dec) (truncate x)
(let ((dec-shifted (truncate (* (abs dec) (expt 10 width)))))
(format stream "~d.~v,vd" int width #\0 dec-shifted))))
인기있는 또 다른 구현 : 여기 내 제안이다 데이브 길레스피의 '계산 Elisp에서 임의 정밀도 부동 소수점 구현 (심지어 bigints이없는 자체!). – Ken