부동점은 어떻게 된 일입니까?

나는 대다수의 이 글을 읽는 사람들이 때때로 부동점 숫자를 사용한 적이 있다고 추측하는데, 통상적으로 고의가 아니다.
나는 또 많은 사람들이 왜 간단하게 계산한 결과가 정확하지 않은지 발견하려고 시도한 후에 그들을 만났다는 것을 상당히 확신한다.예를 들면
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,

    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 ? 나는 지금 어떻게 내가 늙었다고 생각하는지 모르겠지만, 어쨌든 이것은 그들 사이트의 정보이다.

    너는 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 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.

    2진법의

    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

    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, 다음 질문이 있으시면
  • "내가 부동점에서 사용할 수 있는 가장 큰 숫자와 가장 작은 숫자는 무엇입니까?"
  • "금융기구는 이러한 오류를 어떻게 처리합니까?
  • "우리는 다른 기지를 사용할 수 있습니까?"
  • "우리는 실제로 어떻게 부동점 산수를 집행합니까?"
  • 그리고 언제든지 업데이트를 확인하기 위해 주목하세요!너도 트위터에서 나의 최신 소식을 팔로우할 수 있다.만약 문제가 있으면 언제든지 아래에 메시지를 남겨 주십시오.

    좋은 웹페이지 즐겨찾기