On Wednesday, 9 October 2019 at 07:16:43 UTC, Jon Degenhardt
wrote:
On Wednesday, 9 October 2019 at 05:46:12 UTC, berni44 wrote:
On Tuesday, 8 October 2019 at 20:37:03 UTC, dan wrote:
But i would like to be able to do this without knowing the
expansion of pi, or writing too much code, especially if
there's some d function like writeAllDigits or something
similar.
You can use the property .dig to get the number of significant
digits of a number:
writeln(PI.dig); // => 18
You still need to account for the numbers before the dot. If
you're happy with scientific notation you can do:
auto t = format("%.*e", PI.dig, PI);
writeln("PI = ",t);
Using the '.dig' property is a really nice idea and looks very
useful for this. A clarification though - It's the significant
digits in the data type, not the value. (PI is 18 because it's
a real, not a double.) So:
writeln(1.0f.dig, ", ", float.dig); => 6, 6
writeln(1.0.dig, ", ", double.dig); => 15, 15
writeln(1.0L.dig, ", ", real.dig); => 18, 18
Another possibility would be to combine the '.dig' property
with the "%g" option, similar to the use "%e" shown. For
example, these lines:
writeln(format("%0.*g", PI.dig, PI));
writeln(format("%0.*g", double.dig, 1.0));
writeln(format("%0.*g", double.dig, 100.0));
writeln(format("%0.*g", double.dig, 1.00000001));
writeln(format("%0.*g", double.dig, 0.00000001));
produce:
3.14159265358979324
1
100
1.00000001
1e-08
Hopefully experimenting with the different formatting options
available will yield one that works for your use case.
Good solution
But what does it takes to leave a number the way it is without
formatting automatic to 6 significant figure out how that
requires such a work around as shown above. I know C language is
the same but must D follow suit.
One of the compilers, i think the DMD 2.084 (not sure now)
correct but now the recent one's have revert back. Every number
should be left the way it is like java, C#(not sure),
actionscript, javascript, etc.
I don't think it will take that much effort for trivial things
like to stress developers.
This is the best solution i have ever seen on this issue on the
forum.i have ask this question several times on this forum