부동점은 어떻게 된 일입니까?
나는 또 많은 사람들이 왜 간단하게 계산한 결과가 정확하지 않은지 발견하려고 시도한 후에 그들을 만났다는 것을 상당히 확신한다.예를 들면
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진법과 같은 2진법 표현법을 사용하여 이 데이터를 저장한다...
이원분수
An example should help here. Let's choose a random binary fraction: 101011.101
이것은 십진수의 작업 원리와 매우 비슷하다.유일한 차이점은 우리는 기수
2
가 아니라 기수10
가 있다는 것이다.위의 내용을 선택한 바이너리 변환기에 넣으면 정확하다는 것을 알 수 있습니다!그러면 우리는 어떻게 이 2진 점수를 저장합니까?
바이트 (8비트) 를 할당하여 바이트 점수를 저장한다고 가정합시다.
00000000
.그리고 우리는 반드시 한 곳을 선택하여 2진 구분자를 놓아야 한다. 그러면 우리는 2진 수의 소수 부분을 얻을 수 있다.중간에서 강타해 보자!
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 ? 나는 지금 어떻게 내가 늙었다고 생각하는지 모르겠지만, 어쨌든 이것은 그들 사이트의 정보이다.너는 2진법으로 같은 일을 할 수 있다.아니다
칠.∗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
. 이것은 유효한 숫자와 소수점이 상기 숫자의 위치에 비해 숫자를 나타내는 좋은 방법이다.
그렇습니다!부동점은 숫자의 2진 표준 형식 표시이다.
만약 우리가 표현을 형식화하고 싶다면, 우리는 양수와 음수를 고려해야 한다.이를 위해 우리는 ±1을 곱하여 숫자에 기호를 추가합니다.
(서명)∗(유효한 숫자)∗(기본) (일부 전력)
(\text{sign})*(\text{significant digits})*(\text{base})^{(\text{some power})}
(서명)∗(유효한 숫자)∗(기본) (일부 전력)
mathsisfun이 제시한 예로 돌아가서...
700=(1)∗(7)∗(10)2=(1)∗(10101111)∗(2)2
700 = (1) * (7) * (10)^{2}
\\
= (1) * (10101111) * (2)^{2}
700=(1)∗(7)∗(10)2=(1)∗(10101111)∗(2)2
만약 당신이 다른 문헌을 읽고 있다면, 그 표현 형식이 유사하다는 것을 발견할 수 있을 것이다.
(−1) s∗c∗예.
(-1)^s*c*b ^{e}
(−1) s∗c∗예.
어디
sss
기호 위치입니다.
ccc 회사
유효 비트/끝,
bbb 회사
기초
회사 명
지수입니다.
왜 내가 이상한 실수를 하는지😡?
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.
2진법의
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
2진법의
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.
총결산
너무 길어서 읽을 수가 없어요.
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.)