{ "9.877e+417" } [ 987654321098765432 10 400 ^ * "%.3e" sprintf ] unit-test
{ "9.88e+417" } [ 987654321098765432 10 400 ^ * "%.2e" sprintf ] unit-test
{ "9.9e+417" } [ 987654321098765432 10 400 ^ * "%.1e" sprintf ] unit-test
+! This works even on windows (even though %.0e is special on
+! windows) because it doesn't use the fast formatter from the
+! system
{ "1e+418" } [ 987654321098765432 10 400 ^ * "%.0e" sprintf ] unit-test
{ "9e+417" } [ 937654321098765432 10 400 ^ * "%.0e" sprintf ] unit-test
{ "1.0e+418" } [ 997654321098765432 10 400 ^ * "%.1e" sprintf ] unit-test
! Differences on Windows due to setprecision(0)
${ os windows? "2.500000e+00" "2e+00" ? } [ 5/2 "%.0e" sprintf ] unit-test
${ os windows? "3.500000e+00" "4e+00" ? } [ 7/2 "%.0e" sprintf ] unit-test
-
-{ "1e+00" } [ 1.0 "%.0e" sprintf ] unit-test
+${ os windows? "1.000000e+00" "1e+00" ? } [ 1.0 "%.0e" sprintf ] unit-test
[ [ [ >float ] dip ] when ] keep
] if ;
-: ?fix-nonsignificant-zero ( string digits -- string )
- [ ".0" "" replace ] [ drop ] if-zero ;
-
: format-scientific ( x digits -- string )
format-fast-scientific? [
[ "e" format-float-fast ]
- [ ?fix-nonsignificant-zero ] bi
+ [ [ ".0e" "e" replace ] [ drop ] if-zero ] bi
] [ format-scientific-simple ] if ;
: format-fast-decimal? ( x digits -- x' digits ? )
: format-decimal ( x digits -- string )
format-fast-decimal? [
[ "f" format-float-fast ]
- [ ?fix-nonsignificant-zero ] bi
+ [ [ ".0" ?tail drop ] [ drop ] if-zero ] bi
] [ format-decimal-simple ] if ;
ERROR: unknown-printf-directive ;