부동 소수점 숫자를 정확히 소수점으로 포맷


9

모든 이진 부동 소수점은 정확히 10 진수 형식으로 지정할 수 있습니다. 결과 문자열은 다소 길지만 가능합니다. 에서 부동 소수점에 나의 기사 나는 정밀의 중요성을 포함, 지금은이 기능을합니다. 이 문제는 부동 소수점 값을 입력으로 사용하고 정확한 십진 문자열을 출력으로 형식화하는 프로그램 또는 함수를 작성하는 것입니다.

올바른 부동 소수점 숫자로 작업하려면 프로그램에 입력 할 때 정확한 형식을 제공해야합니다. 이 형식은 두 개의 정수 Significand Exponent이며 실제 부동 소수점 값은 Significand * 2 ^ Exponent입니다. 두 값 중 하나는 음수 일 수 있습니다.

사양 :

  • 최소 32 비트 부동 소수점의 범위와 정밀도가 지원되어야합니다 (입력을 초과하지 않음)
  • 십진수 형식의 값은 정확한 표현이어야합니다 (정확한 라운드 팁을 부동으로 되돌릴만큼 충분하지 않음).
  • 표준 라이브러리 부동 소수점 형식화 기능이 정확하거나 충분히 빠르다고 신뢰하지 않으므로 (예 :) printf사용할 수 없습니다. 당신은 서식을 수행해야합니다. 통합 포맷 / 변환 기능이 허용됩니다.
  • .정수 성분이없는 경우 앞에 오는 0을 제외하고 선행 또는 후행 0 이 없을 수 있습니다.
  • 기능 또는 전체 프로그램이 허용됩니다.

예 :

1 -2 => 0.25
17 -3 => 2.125
-123 11 => -251904
17 50 => 19140298416324608
23 -13 => 0.0028076171875
3 120 => 3987683987354747618711421180841033728
3 -50 => 0.00000000000000266453525910037569701671600341796875
-3 -50 => -0.00000000000000266453525910037569701671600341796875
10 -2 => 2.5
-12345 -3 => -1543.125
0 0 => 0
161 -4 => 10.0625
512 -3 => 64

가장 짧은 코드가 승리합니다.


3
무제한 정밀도 부동 소수점 산술을 사용할 수 있습니까?
Dennis

2
지수가 음수가 아닌 경우 다음과 같이 끝날 수 .0있습니까?
Sp3000

@Dennis : 예, 무제한 또는 고정밀 고정밀 산술이 허용됩니다.
edA-qa mort-ora-y 5

1
일관성이 없다고 생각합니다. 경우 0.abc앞에 0이 아닌, 다음 abc.0후행 아니다.
orlp

1
.0부동 소수점 숫자를 다룰 때 항상 정수로 끝나는 것이 관례 입니다. 예를 들어 Python : str(1.0) == '1.0'vs를 참조하십시오 str(1) == '1'. 논리가 여전히 일치하지 않습니다.
orlp

답변:


3

CJam, 43

r_'-&\ize999rim<s1e3'0e[W%999/(i_L?\+'.*sW%

온라인으로 사용해보십시오

설명:

이 프로그램은 최대 ± 999의 지수, 배정 밀도 (64 비트)에 가까운 지수에서 작동합니다. 이 유효 숫자에서 마이너스 (존재하는 경우), 10 승산하여 분리 999 다음 지금 정확한 계산되는 지수와 비트 시프트를 수행한다. 그런 다음 결과에 1000 자리 미만의 숫자가 있으면 왼쪽으로 0으로 채워지고, 마지막 999 자리를 분수 부분으로 분리하고, 역수를 정수로 변환하여 후행 0을 제거하고, 필요한 경우 소수점을 추가하고, 모든 것을 다시 합칩니다.

r_         read and duplicate the significand in string form
'-&        keep only the minus sign, if present
\          swap with the other copy of the significand
iz         convert to integer and get absolute value
e999       multiply by 10^999
ri         read the exponent and convert to integer
m<         shift left by it; negative values will shift right
            the result is an exact non-negative integer
s          convert to string
1e3'0e[    pad to the left with zero characters up to length 1000
            longer strings will be left intact
            we need 1 more than 999 for the 0.xxx case
W%         reverse the string
999/       split into slices of length 999
(          take out the first slice (reversed fractional part)
i          convert to integer
            this removes the leading zeros (trailing in reverse)
_L?        if it's zero, replace with an empty string
\+         concatenate back (to the left) with the second slice
'.*        join the with the dot character
            if the fractional part was zero, we only have the second slice
            (reversed integer part) and there is nothing to join
s          convert to string; this is the reversed result without the sign
W%         reverse back

마지막에 빼기 부호 (있는 경우)와 마지막 문자열이 자동으로 함께 인쇄됩니다.


2

CJam, 50 바이트

q~A1$z#\_0>K5?\z:E#@_s'-&oz*\md_sE'0e[W%isW%'.\+Q?

이것은 STDIN에서 읽는 전체 프로그램입니다. CJam 통역사 에서 온라인으로 사용해보십시오 .

모든 테스트 사례를 한 번에 확인하십시오.


귀하의 의견에 근거하여 CJam은 무제한의 정밀도를 가지고 있으며 여기에서 사용 했습니까? 이 답변이 32 비트 부동 소수점뿐만 아니라 모든 입력을 포괄하는 것이 맞습니까? 또한 작동 방식에 대한 설명을 얻을 수 있습니까?
edA-qa mort-ora-y 5

CJam은 정수 정밀도에 제한이 없지만 배정 밀도 부동 소수점 만 있습니다. 양의 지수의 경우 20의 거듭 제곱과 음의 지수의 경우 거듭 제곱의 5의 거듭 제곱을 곱한 다음 줄에 캐스트하고 점을 삽입합니다. 몇 시간 후에 자세한 설명을 추가하겠습니다.
Dennis

그리고 네, 충분한 메모리가 주어지면 이것은 모든 입력에 작동해야합니다.
Dennis

10 -2 제로 후행 갖고있는 것 같아요
SE 악이기 때문에 aditsu 종료를

@aditsu : 아 네, 2의 모든 거듭 제곱에 대해 하나의 후행 0 ...
Dennis

2

GNU sed + dc, 65

sed의 -r옵션에 대한 점수는 +1입니다 .

y/-/_/
s/.*/dc -e"C8k& 2r^*p"/e
s/\\\n//
s/0+$//
s/^(-?)\./\10./

나는이 점수 dcC8k& 2r^*p10 점에 대해서만 대답 한다고 주장하고 싶었지만 dc몇 가지 형식적인 단점이 있습니다.

  • -ve 부호는 _대신-
  • 긴 줄은 백 슬래시로 구분됩니다
  • 후행 0을 제거해야합니다
  • 앞에 0을 |n| < 1추가해야합니다.

따라서 dc 식은 sed위를 처리하기 위해 랩핑되고 회피됩니다 .

테스트 출력 :

$ echo "1 -2
17 -3
-123 11
17 50
23 -13
3 120
3 -50
-3 -50
8388608 127
1 -127" | sed -rf float.sed
0.25
2.125
-251904
19140298416324608
0.0028076171875
3987683987354747618711421180841033728
0.00000000000000266453525910037569701671600341796875
-0.00000000000000266453525910037569701671600341796875
1427247692705959881058285969449495136382746624
0.0000000000000000000000000000000000000058774717541114375398436826861112283890933277838604376075437585313920862972736358642578125
$ 

흠, 나는 dc표준 형식 기능을 사용하는 것에 대한 규칙을 위반 하는 것이라고 생각합니다 .
edA-qa mort-ora-y

1
나는의 사용 낸 @ Y EDA-qamort - 오라은- dc확인, 주어를 "무제한 또는 높은 고정 정밀도 연산이 허용됩니다" . dcp명령은 " 부동 소수점 형식화 기능" 이 아닙니다. 이는 임의의 정밀 인쇄 기능입니다. 정밀도를 소수점 이하 128 자리 ( C8k) 로 설정하고 있는데 32 비트 부동 소수점보다 충분하다고 생각합니다.
디지털 외상
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.