Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Undefined Behaviour in volk_32f_invsqrt_32f #686

Open
argilo opened this issue Oct 24, 2023 · 3 comments
Open

Undefined Behaviour in volk_32f_invsqrt_32f #686

argilo opened this issue Oct 24, 2023 · 3 comments
Labels

Comments

@argilo
Copy link
Member

argilo commented Oct 24, 2023

UBSAN shows the following Undefined Behaviour in volk_32f_invsqrt_32f:

/home/argilo/git/volk/kernels/volk/volk_32f_invsqrt_32f.h:71:22: runtime error: signed integer overflow: 1597463007 - -569061536 cannot be represented in type 'int'

This is the problematic line:

u.i = 0x5f3759df - (u.i >> 1); // what the fuck?

@jdemel
Copy link
Contributor

jdemel commented Nov 4, 2023

This is: Wikipedia fast inverse square root
It is sometimes called John Carmack reverse because of its use in Q3A.

Fast inverse square root, sometimes referred to as Fast InvSqrt() or by the hexadecimal constant 0x5F3759DF

It is an approximation. It works. It is a hack.

Since this is actually a floating point operation, I suggest to ignore this specific error.

@argilo
Copy link
Member Author

argilo commented Nov 4, 2023

I suspect the signed integer overflow occurs because the input is negative. So this could just be a case where the test input (uniformly distributed floats in the range -1 .. +1) doesn't make sense.

@argilo argilo added the bug label Nov 4, 2023
@jdemel
Copy link
Contributor

jdemel commented Nov 4, 2023

As long as the output signature is 32f, roots of negative values do not exist.

The C reference for sqrt says:

  1. +-0 should return the input value
  2. Values smaller +-0 are NaN. Since NaN == NaN is false, such input should make the test fail.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants