Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

This solution replaces the float with a double. Furthermore, it uses a static assertion (see to guarantee that the double type can represent any int without loss of precision. (See guideline DCL03-C. Use a static assertion to test the value of a constant expression) to guarantee that the double type can represent any int without loss of precision..)

Code Block
bgColor#ccccff
#include <stdio.h>
#include <float.h>

/* define or include a definition of static_assert */

static_assert(sizeof(int) * 8 <= DBL_MANT_DIG); // 8 = bits / char

int main() {
  int big = 1234567890;
  double approx = big;
  printf("%d\n", (big - (int)approx));
  return 0;
}

...

Search for vulnerabilities resulting from the violation of this rule on the CERT website.

Other Languages

Related Guidelines

This rule appears in the C++ Secure Coding Standard as : FLP36-CPP. Beware of precision loss when converting integral types to floating point.

This rule appears in the Java Secure Coding Standard as : INT03-J. Do not cast numeric types to wider floating-point types without range checking.

Bibliography

Wiki Markup
\[[ISO/IEC 9899:1999|AA. Bibliography#ISO/IEC 9899-1999]\] 6.3.1.4: "Real floating and integer"

...