Każdy binarny zmiennoprzecinkowy można sformatować dokładnie w systemie dziesiętnym. Wynikowy ciąg może być nieco długi, ale jest to możliwe. W moim artykule o zmiennoprzecinkowym omawiam znaczenie precyzji, a teraz chcę tę funkcję. Wyzwaniem jest napisanie programu lub funkcji, która pobiera wartość zmiennoprzecinkową jako dane wejściowe i formatuje dokładny ciąg dziesiętny jako dane wyjściowe.
Aby mieć pewność, że pracujemy z prawidłowymi liczbami zmiennoprzecinkowymi, należy podać dokładny format danych wejściowych do programu. Ten format będzie dwiema liczbami całkowitymi Significand Exponent
, gdzie rzeczywista wartość zmiennoprzecinkowa to Significand * 2 ^ Exponent
. Zauważ, że każda wartość może być ujemna.
Specyfika:
- Zakres i precyzja co najmniej 32-bitowej liczby zmiennoprzecinkowej musi być obsługiwana (żadne dane wejściowe nie przekroczą tego)
- Wartość dziesiętna po sformatowaniu musi być dokładnym odwzorowaniem (po prostu wystarczająco blisko, aby zagwarantować, że prawidłowy powrót zaokrąglenia do pływaka nie jest wystarczająco dobry)
- Nie ufamy, że standardowe funkcje formatowania zmiennoprzecinkowego biblioteki są wystarczająco poprawne ani wystarczająco szybkie (np .:)
printf
, dlatego też nie mogą być używane. Musisz wykonać formatowanie. Zintegrowane funkcje formatowania / konwersji są dozwolone. - Nie może być żadnych zer wiodących ani końcowych, z wyjątkiem wymaganego jednego zera wiodącego przed,
.
jeśli nie ma składowej liczby całkowitej - Funkcja lub cały program jest dozwolona.
Przykłady:
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
Najkrótszy kod wygrywa.
źródło
.0
?0.abc
nie jest wiodącym zerem,abc.0
to nie jest końcowe..0
liczbami całkowitymi w przypadku liczb zmiennoprzecinkowych. Zobacz na przykład Python:str(1.0) == '1.0'
versusstr(1) == '1'
. Twoja logika jest nadal niespójna.Odpowiedzi:
CJam, 43
Wypróbuj online
Wyjaśnienie:
Program działa z wykładnikami do ± 999, blisko podwójnej precyzji (64 bity). Oddziela znak minus (jeśli jest obecny) od znaczenia, mnoży go przez 10 999, a następnie przesuwa nieco z wykładnikiem, który jest teraz dokładnym obliczeniem. Następnie wypełnia go zerami po lewej stronie, jeśli wynik ma mniej niż 1000 cyfr, oddziela 999 ostatnich cyfr jako część ułamkową, usuwa zera końcowe przez konwersję odwrotności na liczbę całkowitą, w razie potrzeby dodaje kropkę dziesiętną i składa wszystko z powrotem.
Na końcu znak minus (jeśli występuje) i końcowy ciąg są automatycznie drukowane razem.
źródło
CJam, 50 bajtów
Jest to pełny program, który czyta ze STDIN. Wypróbuj online w interpretatorze CJam .
Sprawdź wszystkie przypadki testowe jednocześnie.
źródło
GNU sed + dc, 65
Wynik obejmuje +1 dla
-r
opcji sed .Kusiło mnie, by zażądać tej
dc
odpowiedziC8k& 2r^*p
- tylko 10 punktów, ale mamdc
pewne dziwactwa formatowania:_
zamiast jest znak -ve-
|n| < 1
należy dodać 0Tak więc wyrażenie dc jest pakowane i sprawdzane,
sed
aby zająć się powyższym.Wyjście testowe:
źródło
dc
narusza moją zasadę używania standardowej funkcji formatowania.dc
jest w porządku, biorąc pod uwagę, że „dozwolona jest arytmetyka nieograniczona lub wysoka stała precyzja” .dc
„sp
polecenie nie jest« pływający punkt funkcję formatowania» - to dowolna funkcja precyzyjnego druku. Ustawiam precyzję na 128 miejsc po przecinku (C8k
), co moim zdaniem jest więcej niż wystarczające dla dowolnej liczby 32-bitowej.