他の回答で述べたように、フロートは不正確です。また、Visualworks Float の既定値は単精度 (小数点以下約 7 桁) であることも覚えておいてください。浮動小数点数に文字 d を付けると、5.1d のように倍精度 (小数点以下約 15 桁) になり、不正確さは減りますが、それでも不正確になります。
混乱のもう 1 つの原因は、2 つの異なる Float が Visualworks で同じ近似 10 進数表現で印刷できることです。
5.1 squared printString
-> '26.01'
しかし
5.1 squared = 26.01
-> false
最近の Squeak または Pharo は、異なる Float を区別するのに十分な数の小数を出力することに注意してください (そしてそれらを変更せずに再解釈します)。
5.1 squared
->26.009999999999998
または、いわゆる FixedPoint (VisualWorks では、または他のフレーバーでは ScaledDecimals) を使用して、正確な操作を実行できます。
theTestArray := #(1.2s 3 5.1s 7).
self assert: theTestArray squareOfAllElements = #(1.44s 9 26.01s 49).
また、この別のトラップにも注意してください。FixedPoint (ScaledDecimals) は、指定された分数の後に小数を出力しますが、内部的にはそれ以上 (無限に多く) を保持できます。
5.1s1 squared printString
-> '26.0s1'
しかし
5.1s1 squared = 26.01s2
-> true