We have a game that needs to be deterministic as it is part of its multiplayer model. We also use Lua, which uses the
sprintf internally (the format is
The problem arises when it prints number like 0.00001. In some cases it prints
1e-05 and in some other cases, it prints
1e-005 (extra zero).
For example when compiled with Visual studio 2015 it prints
1e-005, and with Visual studio 2013 it prints
1e-05. I tried different locale settings, but it doesn’t seem to have any effect.
The question is: What is the best solution to achieve deterministic results?
I don’t really care if the scientific notation is standardized, or eliminated.
Solutions I thought about:
- When I use the
%fnotation, it doesn’t ignore the insignificant zeroes, so having
%.14fwould result into impractically long numbers.
- Using custom
sprintfmethod (copy pasted from some of the standard libraries)
- Using some special format I didn’t thought about (I use only this as reference: http://www.cplusplus.com/reference/cstdio/printf/)
Practice As Follows
A year later, this is how we solved it.
We downloaded custom print implementation (trio) and forced usage of this implementation instead of the system one in the lua (and our sources).
We also had to change
long double trio_long_double_t;
in the triodef.h to ensure the Visual studio and linux/mac gives the same results.