何が浮動小数点ですか?
私はまた、かなり単純な計算の結果が間違っている理由を発見しようとした後、それらに遭遇した良い番号をかなり確信しています.例えば
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進数についてはどうですか?分数、π、実数?
どんな有用な計算のためにでも、我々は以下を表すことができるコンピュータを必要とします:
まあ、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,
- store the significant digits of the number we want to represent (E.G. the 12 in 0.00000012);
- 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
This is why numbers like can't be represented in a finite number of digits; has and as prime factors, neither of which are a factor of .
Let's work through an example in decimal.
十進法
Say you want to add the numbers
and
. We all know the answer is
42
, but if we are working in decimal, this isn't as obvious.
This is because
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...
Which is definitely not . It's real close, but it's not .
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 has one less prime factor than , namely .
Because of this, recurring fractions happen more commonly in base .
An example of this is :
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 and
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 to
バイナリ
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 , それで、以下のような質問があります.Reference
この問題について(何が浮動小数点ですか?), 我々は、より多くの情報をここで見つけました https://dev.to/timroderick/what-s-up-with-floating-point-o8lテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol