> That suggests maybe the name should communicate "safe for JavaScript"; or > more generally "safe for 64-bit IEEE floating point". > > is_safe_for_js() > is_safe_for_float()
I'm not sure we should mention Javascript, because it's actually related to floating point storage. > I'm not sure if accepting floats in the same function makes sense. If the > question is "can this value safely be stored in a float?" and you give it a > float, then the answer is surely "yes". You have no way of knowing if it > _already_ lost precision during a previous operation. > > Possibly there could be a separate function which asks "can this float value > be safely converted to an integer?", but that implies a different definition > - it wouldn't make much sense to answer "yes" for 3.5, or NaN. I think we can see this function more like "can this number be compared safely?", e.g. `var_dump(2**53 === (2**53)+1);` returns true as these numbers are not in the safe interval. A name like `is_safely_comparable()` would fit better maybe. > My thinking is that this needs new syntax, to avoid dozens of specific > functions. For instance, a generic (or generic-like) form: > > function can_lossless_cast<T>(mixed $value): bool > > can_lossless_cast<float>(2 ** 50) === true > can_lossless_cast<float>(2 ** 54) === false > > can_lossless_cast<int>(2 .0** 54) === true > can_lossless_cast<int>(2.0 ** 65) === false > can_lossless_cast<int>(3.5) === false > can_lossless_cast<int>(NaN) === false > > can_lossless_cast<int>('9007199254740991000') == true // less than 2**64 > can_lossless_cast<float>('9007199254740991000') == false // more than 2**53 > > can_lossless_cast<int|float>('9007199254740991000') == true > can_lossless_cast<int|float>('3.5') == true I really like the idea of generic functions, I however imagine it would bring a lot more complexity and really profound changes to the engine, well beyond the scope of the proposal. Maybe the better naming of the function would solve this? Best, Alex