Not all numbers are exactly representable as floats


Representable numbers

The number of digits (or bits) of precision also limits the set of rational numbers that can be represented exactly. For example, the number 123456789 clearly cannot be exactly represented if only eight decimal digits of precision are available.

Inexactness

Floating-point arithmetic on digital computers is inherently inexact. The 24 bits (including the hidden bit) of mantissa in a 32-bit floating-point number represent approximately 7 significant decimal digits. Unlike the real number system, which is continuous, a floating-point system has gaps between each number. If a number is not exactly representable, then it must be approximated by one of the nearest representable values.

In Softimage, you can see the inexactness of floating point numbers with a floating point parameter on a PPG, or with the Scalar node in an ICE tree. In either case, try entering the value 123456789: you’ll end up with the value 123456792.

If you run this Python snippet in a script editor, you can try this out:

import win32com.client
from win32com.client import constants

xsi = Application

oCustomProperty = xsi.ActiveSceneRoot.AddProperty( "CustomProperty", False, "Test" )
oCustomProperty.AddParameter2("Int",constants.siInt4,0,None,None,0,None,constants.siClassifUnknown,constants.siPersistable + constants.siKeyable)
oCustomProperty.AddParameter2("Float",constants.siFloat,0,None,None,0,None,constants.siClassifUnknown,constants.siPersistable + constants.siKeyable)
oCustomProperty.AddParameter2("Double",constants.siDouble,0,None,None,0,None,constants.siClassifUnknown,constants.siPersistable + constants.siKeyable)

xsi.InspectObj( oCustomProperty )

xsi.SetValue("Test.Float", 123456789)
x = xsi.GetValue( "Test.Float" )

xsi.LogMessage( x )
# INFO : 123456792.0