Note | ||
---|---|---|
| ||
This rule may be deprecated and replaced by a similar guideline. 06/28/2014 -- Version 1.0 |
The Java language provides two primitive floating-point types, float
and double
, which are associated with the single-precision 32-bit and double-precision 64-bit format values and operations specified by IEEE 754 [IEEE 754]. Each of the floating-point types has a fixed, limited number of mantissa bits. Consequently, it is impossible to precisely represent any irrational number (for example, pi). Further, because these types use a binary mantissa, they cannot precisely represent many finite decimal numbers, such as 0.1, because these numbers have repeating binary representations.
...
Using floating-point representations when precise computation is required can result in a loss of precision and incorrect values.
Rule | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
NUM04-J | Low | Probable | High | P2 | L3 |
Automated Detection
Automated detection of floating-point arithmetic is straightforward. However, determining which code suffers from insufficient precision is not feasible in the general case. Heuristic checks, such as flagging floating-point literals that cannot be represented precisely, could be useful.
Tool | Version | Checker | Description |
---|---|---|---|
Parasoft Jtest |
|
|
|
CERT. |
NUM04.UBD |
Do not use "float" and "double" if exact answers are required |
Related Guidelines
FLP02-C. Avoid using floating-point numbers when precise computation is needed | |
VOID FLP02-CPP. Avoid using floating point numbers when precise computation is needed | |
Floating-Point Arithmetic [PLF] |
Android Implementation Details
The use of floating-point on Android is not recommended for performance reasons.
Bibliography
Item 48, "Avoid | |
Puzzle 2, "Time for a Change" | |
[IEEE 754] |
[JLS 2015] | |
[Seacord 2015] |
...
...