Skip to content

Commit

Permalink
glslang representing literal constants with double precision, so 1.0e…
Browse files Browse the repository at this point in the history
…40 and 1.0e-50 are normal values.

Shader1:
precision highp float;
out vec4 my_FragColor;
void main()
{
// Out-of-range floats should overflow to infinity
// GLSL ES 3.00.6 section 4.1.4 Floats:
// "If the value of the floating point number is too large (small) to be stored as a single precision value, it is converted to positive (negative) infinity"
float correct = isinf(1.0e40) ? 1.0 : 0.0;
my_FragColor = vec4(0.0, correct, 0.0, 1.0);
}

precision highp float;
out vec4 my_FragColor;
void main()
{
// GLSL ES 3.00.6 section 4.1.4 Floats:
// "A value with a magnitude too small to be represented as a mantissa and exponent is converted to zero."
// 1.0e-50 is small enough that it can't even be stored as subnormal.
float correct = (1.0e-50 == 0.0) ? 1.0 : 0.0;
my_FragColor = vec4(0.0, correct, 0.0, 1.0);
}
KHR-GLES3.number_parsing.float_out_of_range_as_infinity
  • Loading branch information
jimihem committed Nov 6, 2023
1 parent 302a663 commit f830f8f
Showing 1 changed file with 11 additions and 1 deletion.
12 changes: 11 additions & 1 deletion glslang/MachineIndependent/Intermediate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2589,7 +2589,17 @@ TIntermConstantUnion* TIntermediate::addConstantUnion(bool b, const TSourceLoc&
TIntermConstantUnion* TIntermediate::addConstantUnion(double d, TBasicType baseType, const TSourceLoc& loc, bool literal) const
{
assert(baseType == EbtFloat || baseType == EbtDouble || baseType == EbtFloat16);

if (baseType == EbtFloat)
d = (float)d;
else if (baseType == EbtFloat16 && !IsInfinity(d) && !IsNan(d)) {
int exponent = (((*(unsigned long long*)&d) >> 52) & 0x7ff) - 1023;
if (exponent < -14)
d = 0.0;
else if (exponent > 15){
(*(unsigned long long*)&d) &= ~((((unsigned long long)1) << 52) - 1);
(*(unsigned long long*)&d) |= ((unsigned long long)0x7ff) << 52;
}
}
TConstUnionArray unionArray(1);
unionArray[0].setDConst(d);

Expand Down

0 comments on commit f830f8f

Please sign in to comment.