23

配列インデックスを計算するために、 aCGFloatを anに床または天井にする必要があることがよくあります。int

floorf(theCGFloat)orで常に見られる問題ceilf(theCGFloat)は、浮動小数点の不正確さで問題が発生する可能性があることです。

では、私のが、内部的には、またはそのようなものとして表されている場合CGFloat2.0fどうなり1.999999999999fますか。これは再びフロートですfloorf1.0fそれでも、この獣を int にキャストする必要があるため、別の問題が発生する可能性があります。

のようなものが誤って床に落ちたり、誤って天井に落ちたりすることがないようfloatに、 a を床または天井にするベストプラクティスはありますか?int2.012.02

4

3 に答える 3

22

あなたの質問にはいくつかの誤解があります。

CGFloat が 2.0f であるが、内部的には 1.999999999999f として表されている場合

起こり得ません。2.0 は、すべての適度に小さい整数と同様に、浮動小数点で正確に表現されます。CGFloatがの場合、2.0f実際には 2.0 です。

2.0 のようなものが誤って 2 に制限されることはありません

2.0 の上限2 です。他に何がありますか?


あなたが本当に求めている質問は、「数学的には正確に 2.0 である必要があるが、実際にはわずかに小さい不正確な結果を生成する計算を行うとしますfloorその値に適用すると、2.0 ではなく 1.0 が得られます。 - どうすればこれを防ぐことができますか?」

これは実際には、「正しい」答えが 1 つもないかなり微妙な質問です。入力値をどのように計算しましたか? その結果どうしますか?

于 2012-08-16T19:33:36.247 に答える
4

編集-この答えが正しくない理由のためにコメントを読んでください:)

floataをanにキャストすることintは、暗黙的です。floorfつまり、(int)5.9です5。あなたがそれを気にしないなら、それからただキャストしてください:)

切り上げたい場合は、ceilf-の結果をキャストします。丸め後にキャストしてもエラーは発生しません(または、必要に応じて、キャスト前にエラーを追加します。つまり、 `(int)(5.9 + 1)'は'6です。 '-切り上げと同じ)。

最も近い値に丸めるには、0.5を追加(int)(5.9+0.5)する6だけ(int)(5.4+0.5)です5。私はただ使用しますがroundf(5.9):)

于 2012-08-16T19:27:23.753 に答える