Why does division yield a vastly different result than multiplication by a fraction in floating points.

Posted by Avram on Stack Overflow See other posts from Stack Overflow or by Avram
Published on 2011-01-02T01:34:46Z Indexed on 2011/01/02 1:54 UTC
Read the original article Hit count: 544

Filed under:
|
|

I understand why floating point numbers can't be compared, and know about the mantissa and exponent binary representation, but I'm no expert and today I came across something I don't get:

Namely lets say you have something like:

float denominator, numerator, resultone, resulttwo;

resultone = numerator / denominator;

float buff = 1 / denominator;

resulttwo = numerator * buff;

To my knowledge different flops can yield different results and this is not unusual. But in some edge cases these two results seem to be vastly different. To be more specific in my GLSL code calculating the Beckmann facet slope distribution for the Cook-Torrance lighitng model:

float a = 1 / (facetSlopeRMS * facetSlopeRMS * pow(clampedCosHalfNormal, 4));
float b = clampedCosHalfNormal * clampedCosHalfNormal - 1.0;
float c = facetSlopeRMS * facetSlopeRMS * clampedCosHalfNormal * clampedCosHalfNormal;

facetSlopeDistribution = a * exp(b/c);

yields very very different results to

float a = (facetSlopeRMS * facetSlopeRMS * pow(clampedCosHalfNormal, 4));
facetDlopeDistribution = exp(b/c) / a;

Why does it? The second form of the expression is problematic.

If I say try to add the second form of the expression to a color I get blacks, even though the expression should always evaluate to a positive number. Am I getting an infinity? A NaN? if so why?

© Stack Overflow or respective owner

Related posts about opengl

Related posts about float