Versions Compared

Key

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

Using integer arithmetic to calculate a value for assignment to a floating-point variable may lead to loss of information. This can be avoided by converting one of the integers in the expression to a floating-point type. When converting integers to floating-point values, it is important to be aware that there may can be loss of precision. (See guideline INT03-J. Avoid casting primitive integer types to floating-point types without range checks.)

...

In this noncompliant code example, the division and multiplication operations take place on integers and the result gets converted to floating-point. This causes floating-point variables d, e, and f to be initialized incorrectly because the operations take place before the values of a, b and c are converted to floating-point. The results of the operations are either truncated to the nearest integer, or may they could overflow.

Code Block
bgColor#FFCCCC
short a = 533;
int b = 6789;
long c = 4664382371590123456L;

float d = a / 7;    // d is 76.0 (truncated)
double e = b / 30;  // e is 226.0 (truncated)
double f = c * 2;   // f is -9.1179793305293046E18 because of overflow

...

This compliant solution eliminates the decimal error in initialization by ensuring that, at least, one of the operands to the division operation is of the floating-point type.

...

This compliant solution eliminates the initialization errors by storing the integers in the floating-point variables and , then performing the arithmetic operations. This ensures that, at least, one of the operands is a floating-point number, and, consequently, the operation is performed on floating-point numbers.

...

FLP02-EX1: When the programmer intends to use integers before the conversion (for example, obviating the need to use the floor() method), this choice should be clearly documented to help future maintainers understand that this behavior is intentional.

...

Improper conversions between integers and floating point values may can yield unexpected results, especially as a result of from precision loss. In some cases, these unexpected results may can involve overflow or undefined behavior.

...

Automated detection is not feasible in the general case. Heuristic checking may could be useful.

Related Vulnerabilities

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

Other Languages

Related Guidelines

This guideline appears in the C Secure Coding Standard as : FLP33-C. Convert integers to floating point for floating point operations.This guideline appears in

the C++ Secure Coding Standard as : FLP33-CPP. Convert integers to floating point for floating point operations.

Bibliography

Wiki Markup
\[[JLS 2005|AA. Bibliography#JLS 05]\] [Section 5.1.2, Widening Primitive Conversion|http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.2]

...