Always false float comparisons

Ola Fosheim Grøstad via Digitalmars-d digitalmars-d at puremagic.com
Tue May 17 06:39:22 PDT 2016


On Monday, 16 May 2016 at 15:11:21 UTC, Daniel Murphy wrote:
> On 16/05/2016 10:37 PM, Walter Bright wrote:
>> Some counter points:
>>
>> 1. Go uses 256 bit soft float for constant folding.
>>
>
> Then we should use 257 bit soft float!

Go uses at least 288 bits!!!!! (256 bits mantissa and 32 bits 
exponent).

But Go has a completely different take on constant expressions, 
and much better than the C family that D belongs to (but still 
far from ideal). From https://golang.org/ref/spec:

«
Numeric constants represent exact values of arbitrary precision 
and do not overflow. Consequently, there are no constants 
denoting the IEEE-754 negative zero, infinity, and not-a-number 
values.

Constants may be typed or untyped. Literal constants, true, 
false, iota, and certain constant expressions containing only 
untyped constant operands are untyped.

A constant may be given a type explicitly by a constant 
declaration or conversion, or implicitly when used in a variable 
declaration or an assignment or as an operand in an expression. 
It is an error if the constant value cannot be represented as a 
value of the respective type. For instance, 3.0 can be given any 
integer or any floating-point type, while 2147483648.0 (equal to 
1<<31) can be given the types float32, float64, or uint32 but not 
int32 or string.

An untyped constant has a default type which is the type to which 
the constant is implicitly converted in contexts where a typed 
value is required, for instance, in a short variable declaration 
such as i := 0 where there is no explicit type. The default type 
of an untyped constant is bool, rune, int, float64, complex128 or 
string respectively, depending on whether it is a boolean, rune, 
integer, floating-point, complex, or string constant.

Implementation restriction: Although numeric constants have 
arbitrary precision in the language, a compiler may implement 
them using an internal representation with limited precision. 
That said, every implementation must:

Represent integer constants with at least 256 bits.
Represent floating-point constants, including the parts of a 
complex constant, with a mantissa of at least 256 bits and a 
signed exponent of at least 32 bits.
Give an error if unable to represent an integer constant 
precisely.
Give an error if unable to represent a floating-point or complex 
constant due to overflow.
Round to the nearest representable constant if unable to 
represent a floating-point or complex constant due to limits on 
precision.
These requirements apply both to literal constants and to the 
result of evaluating constant expressions.
»

See also https://golang.org/ref/spec#Constant_expressions



More information about the Digitalmars-d mailing list