何が浮動小数点ですか?


私はこれを読んでほとんどの人はいくつかの時点では、しばしば意図的に浮動小数点数を使用している.
私はまた、かなり単純な計算の結果が間違っている理由を発見しようとした後、それらに遭遇した良い番号をかなり確信しています.例えば
0.1 + 0.2
// result: 0.30000000000000004
// Which I'm fairly sure
// should be 0.3 ...
問題は、浮動小数点数が何であるかを理解することなく、あなたはしばしばあなたが期待した結果がこれほど少し異なると不満を見つけるでしょう.
ここでの私の目標は、浮動小数点数がどのようなものであるか、なぜ私たちがそれらを使用するのか、そしてどのように働くかを明確にすることです.

なぜ浮動小数点も必要ですか🤔?

It's not a bold statement to say that computers need to store numbers. We store these numbers in binary on our phones, laptops, fridges etc.

I hope that most people reading this are familiar with binary numbers in some form; if not, consider reading this blog post by Linda Vivah .
しかし、10進数についてはどうですか?分数、π、実数?
どんな有用な計算のためにでも、我々は以下を表すことができるコンピュータを必要とします:
  • veryveryveryyvery小さい数.
  • veryveryveryvery大きい数字
  • 中のすべて!
  • veryveryveryyvery小さな数字で始まる、正しい方向に私たちを取るどうやってそれらを保存するのですか?
    まあ、thats簡単.バイナリ形式で10進数表現を使用します.

    バイナリ分数

    An example should help here. Let's choose a random binary fraction: 101011.101


    これは10進数の働きに非常に似ています.唯一の違いは、我々が基地を持っているということです2 代わりに10 . あなたが選択のバイナリコンバータで上記のチャックならば、あなたはそれが正しいとわかります!
    では、どのようにこれらのバイナリの端数を格納するのでしょうか?
    バイナリバイトを格納するために1バイト(8ビット)を割り当てます.00000000 . バイナリのセパレータを配置する場所を選択し、バイナリ番号の小数部分を持つことができます.
    途中でスマックバンを試みましょう!
    0000.0000
    
    私たちがこれで表現できる最大の数は何ですか?
    1111.1111 = 15.9375
    
    それであまり印象的でない.どちらも私たちが表すことができる最小の数です.0.00625 .
    ここに無駄なストレージスペースがたくさんあります.問題は、私たちのポイントを置く任意の場所を選択すると、どちらかの分数精度または大きな整数範囲ではなく、両方のままになります.
    我々がちょうど我々が必要に応じて端点を動かすことができるならば、我々は我々の限られた保管からそんなに多くを得ることができました.それが必要に応じてポイントが浮動小数点を回避できる場合は、浮動小数点数.
    申し訳ありませんが😅.)

    それで、浮動小数点は何ですか?

    Floating point is exactly that, a floating ( fractional ) point number that gives us the ability to change the relative size of our number.

    So how do we mathematically represent a number in such a way that we,

    1. store the significant digits of the number we want to represent (E.G. the 12 in 0.00000012);
    2. know where to put the fractional point in relation to the significant digits (E.G. all the 0's in 0.00000012)?

    To do this, let's time travel (for some) back to secondary school...

    標準形(科学表記)

    Anyone remember mathsisfun ? 私はどうにか今すぐに感じます、しかし、いずれにせよ、これは彼らのウェブサイトからあります:

    あなたはバイナリと全く同じことを行うことができます!の代わりに
    7∗102 = 7007 * 10 ^ 2 = 7007∗102 = 700
    書くことができます
    1010111100∗20 = 700 = 10101111∗22 = 700
    1010111100 * 2 ^ 0 = 700
    \\
    = 10101111 * 2 ^ 2 = 700
    1010111100∗20 = 700 = 10101111∗22 = 700

    175∗4 = 700175 * 4 = 700175∗4 = 700
    これは、桁数に基づいて数を表現するのに最適な方法です.
    それだ!浮動小数点数のバイナリ標準形式表現です.
    表現を少しフォーマルにしたいなら、正と負の数を説明する必要があります.これをするために、我々はまた、1を乗じて数に符号を付ける.
    (符号)∗(重要数字)∗(ベース)
    (\text { sign })*(\text { base })^{ (\text { some power })) }
    (符号)∗(重要数字)∗(ベース)
    そして、Mathsisfunによって与えられる例に戻ってください.
    700 == ( 1 )∗( 7 )∗( 10 ) 2 = ( 1 )∗(10101111)∗( 2 ) 2
    700 =( 1 )*( 7 )*( 10 )^{ 2 }}
    \\
    === ( 2 )
    700 == ( 1 )∗( 7 )∗( 10 ) 2 = ( 1 )∗(10101111)∗( 2 ) 2
    あなたが他の文学を読んでいるならば、あなたは表現が何かのように見えるとわかります.
    (−1)∗c∗ビー
    (- 1 )^ s * c * b ^{ e }
    (−1)∗c∗ビー
    どこ
    理研
    が符号ビットである.
    CCC
    意味とは何か
    BBB
    がベースで、
    EEE
    が指数です.

    だから、なぜ私は奇妙なエラーを得る午前😡?

    So, we know what floating point is now. But why can't I do something as simple as add two numbers together without the risk of error?

    Well the problem lies partially with the computer, but mostly with mathematics itself.

    反復分数

    Recurring fractions are an interesting problem in number representation systems.

    Let's choose any fraction xy\frac{x}{y}

    This is why numbers like 1/211/21 can't be represented in a finite number of digits; 2121 has 77 and 33 as prime factors, neither of which are a factor of 1010 .

    Let's work through an example in decimal.

    十進法

    Say you want to add the numbers 1/31/3 and 2/32/3 . We all know the answer is 42 11 , but if we are working in decimal, this isn't as obvious.

    This is because 1/3=0.333333333333...1/3 = 0.333333333333...

    It isn't a number that can be represented as a finite number of digits in decimal. As we can't store infinite digits, we store an approximation accurate to 10 places.

    The calculation becomes...

    0.3333333333+0.6666666666=0.999999999 0.3333333333+0.6666666666=0.999999999

    Which is definitely not 11 . It's real close, but it's not 11 .

    The finite nature in which we can store numbers doesn't mesh well with the inevitable fact that we can't easily represent all numbers in a finite number of digits.

    バイナリ

    This exact same problem occurs in binary, except it's even worse! The reason for this is that 22 has one less prime factor than 1010 , namely 55 .

    Because of this, recurring fractions happen more commonly in base 22 .

    An example of this is 0.10.1 :

    In decimal, that's easy. In binary however... 0.00011001100110011... , it's another recurring fraction!

    So trying to perform 0.1 + 0.2 becomes

      0.0001100110011
    + 0.0011001100110
    = 0.0100110011001
    = 0.299926758
    

    Now before we got something similar to 0.30000000004 , this is because of things like rounding modes which I won't go into here (but will do so in a future post). The same principle is causing this issue.

    This number of errors introduced by this fact are lessened by introducing rounding.

    精度

    The other main issue comes in the form of precision.

    We only have a certain number of bits dedicated to the significant digits of our floating point number.

    十進法

    As an example, consider we have three decimal values to store our significant digits.

    If we compare 333333 and 1/31031/3 * 10^3

    This is because we only have three values of precision to store the significant digits of our number, and that involves truncating the end off of our recurring fraction.

    In an extreme example, adding 11 to 11031*10^3

    バイナリ

    This exact same issue occurs in binary with veryveryveryvery small and veryveryveryvery big numbers. In a future post I will be talking more about the limits of floating point.

    For completeness, consider the previous example in binary, where we now have 3 bits to represent our significant digits.

    By using base 2 instead, 1 * 2^3 , adding 1 to our number will result in no change. This is because to represent 1001 (now equivalent to 9 in decimal) requires 4 bits, the less significant binary digits are lost in translation.

    There is no solution here, the limits of precision are defined by the amount we can store. To get around this, use a larger floating point data type.

    • E.G. move from a single-precision floating-point number to a double-precision floating-point number.

    概要

    TLR

    To bring it all together, floating-point numbers are a representation of binary values akin to standard-form or scientific notation .
    それは私たちの精度と大小の数字を格納することができます.
    これをするために、私たちは、その数を使用されているベースに比例した率でより大きいかより小さくするために数の重要な桁に対する分数点を動かします.
    浮動小数点に関連するエラーの大部分は、有限数のビット内の定期的な分数を表現する形式である.これらのエラーを減らすのに役立つ.

    感謝🥰!

    Thank you so much for reading! I hope this was helpful to those that needed a little refresher on floating point and also to those that are new to this concept.

    I will be making one or two updates to this post explaining the in-depths of the IEEE 754-2008 Floating Point Standard , それで、以下のような質問があります.
  • 浮動小数点数で使用できる最大の最小数は何ですか?」
  • 金融機関はこれらのエラーについて何をしていますか.
  • 「他の基地は使えますか?」
  • 浮動小数点演算はどうやって実行するのですか
  • その後、更新を参照してくださいに従うこと自由に感じなさい!また、更新のためのTwitterで私に従うことができます.あなたが質問をするならば、下記のコメントを残して自由に感じてください.