1


0

Flexの簡単な計算問題

フレックスの計算に問題があります。ピクセル値をmmに変換し、逆にしようとしています。

69.8から始めます。

Calculating MM to pixel from: 69.8 mm
69.8*300 = 20940
20940 / 2.54 = 8244.094488188975
8244.094488188975 / 10 = 824.4094488188975

そして、逆算:

Calculating pixel to MM from: 824.4094488188975
824.4094488188975/300 = 2.7480314960629917
2.7480314960629917 * 2.54 = 6.979999999999999
6.979999999999999 * 10 = 69.79999999999998

69.8が必要でしたが、69.79999999999998になりました。 単純なウィンドウcalcを使用してプロセスを追跡しましたが、最初に問題が発生したのは20940 / 2.54 = 8244.094488188975で、これは8244,094488188976であるはずです。

これに関するアニーの助けは素晴らしいでしょう。

2 Answer


7


わかりました、これはFlexの質問ではなく、一般的なプログラミングに関する質問です。 コンピューターに数字がどのように正確に保存されているのか疑問に思ったことはありませんか? 詳細は数学の詳細にありますが、簡単にしようと思います。 無限の数の異なる実数があることを知っています(例: 連続した線上の点のように)、コンピューターにすべてをゼロと1として格納し、それらの限られた量(32または64の「ビット」)を格納します。 だから今、問題があります-限られたスペースで無制限の数を表現する方法。 浮動小数点数(1.03や4.2232のような「ドット」付きの値を持つことができるもの)で使用されるアイデアは、すべてを保持することはできないため、最も近い数に丸めることです。

誰かがコーヒーに入れる砂糖の量を思い出すのに少し似ていますが、テーブルスプーンはその上にあるものの正確な量を測るのにあまり良くないので、彼が1.1232杯の砂糖を好むことを覚えていません。 1に丸めると、ほとんどの場合うまくいきます。

したがって、浮動小数点数でも同様の考え方が成り立ち、余分なひねりが加えられます-数値は、0から離れるよりも0の近くではるかに密になり、それらの間の「空のスペース」は非常に大きくなります。 たとえば、最大値から10000を減算しても、最も近い値を探すときに違いが生じるほど近い数値はないため、数値は同じままです。

    trace (Number.MAX_VALUE == Number.MAX_VALUE-10000);
    //  returns "true"
    trace (200000 == 200000 - 10000);
    //  returns "false"

したがって、あなたの問題は、数字が正確ではないが完全に正確であると仮定することから生じます。 as3のNumberは、倍精度IEEE-754標準に準拠しており、それがどの番号を持ち、どの番号を丸めるかを決定する方法です。

これを見てください。

trace (8244.094488188976);
// returns "8244.094488188975"

参考文献:


0


_ これは、浮動小数点演算を使用するアプリケーションの現実です。 _