"docs/api-reference.md" did not exist on "3b2d2c8326c245f0210a549777d0a77c2ccd92d1"
Added precise division function to fix rounding issues due to `-use_fast_math`
Summary: This diff fixes some long standing issue with skinning weights some times been negative. Since initial value of skinning weights are always non-negative, and blending coefficients are supposed to be in range [0..1], and such blending of skinning weight should be non-negative. Unfortunately that was not the case in practice, despite various clamps. The issue was hunted down to this part of the code: c_a = mass_a / mass_ab; c_b = 1.0f - c_a; Even if `mass_a` matches `mass_ab` bit-perfect, `c_a` might not be equal to `1.0`, but some times to `0.999999940395355224609375` and some times to `1.000000119209289550781250`. The later value causes `c_b` to be negative, which leads to negative skinning weights. tsimk figured out that this behavior is due to the nvcc flag `-use_fast_math` which makes all devision operators `x/y` to compile to `__fdividef(x, y)` which it turn somehow does not produce exactly 1.0 when dividing same, bit-perfect numbers. See https://docs.nvidia.com/cuda/cuda-c-programming-guide/#intrinsic-functions . D71423305 Reviewed By: phg1024 Differential Revision: D71436810 fbshipit-source-id: 64c4e6368d07368ee75997da088d3952ed0c36d0
Showing
Please register or sign in to comment