On 1/19/21 6:50 PM, Ali Çehreli wrote:
On 1/19/21 6:04 AM, drug wrote:
> Another (low level) way is to shift mantissa left by exponent value.
Luckily, we already have a helper in Phobos:
https://dlang.org/phobos/std_bitmanip.html#FloatRep
Ali
That makes life simpler, thanks for sharing this:
```D
import std;
void main()
{
auto valueRange = [
10.000000000000001,
10.0000000000000001, // in fact this is just 10.0
];
foreach(value; valueRange)
{
auto dr = DoubleRep(value);
const hasFractional = !!(dr.fraction << (dr.exponent-1023+12));
writefln("has `%.18f` fractional part: %s", value, hasFractional);
}
}
```
but I think that casting to long and comparing it to the value is easier
to understand and more portable:
```D
import std;
void main()
{
auto valueRange = [
10.000000000000001,
10.0000000000000001, // in fact this is 10.0
];
foreach(value; valueRange)
{
const hasFractional = (value != cast(long)value);
writefln("has `%.18f` fractional part: %s", value, hasFractional);
}
}
```
P.S. shouldn't compiler emit the error if a literal can't be represented
lossless?