위 수식이 틀린 이유는? (개발자 면접 타임)

Поделиться
HTML-код
  • Опубликовано: 23 дек 2024

Комментарии • 929

  • @salm2000
    @salm2000 2 года назад +479

    아, 실습 시간에 전부 정수로 바꿔서 하니까, 조교가 "참 좋은 습관이다."라고 했는데...
    이해가 되네요.

  • @김동현-q3i5k
    @김동현-q3i5k 2 года назад +3234

    요즘 같이 가정용 패트리어트 미사일 하나씩 필수인 세상에 이거 몰랐으면 비명횡사할 뻔 했네요 감사합니다 !

    • @cream7222
      @cream7222 2 года назад +52

      ㅇㅈ

    • @ultrakal1
      @ultrakal1 2 года назад +42

      ㅇㅈ

    • @이태연-d3p
      @이태연-d3p 2 года назад +41

      ㅇㅈ

    • @dead_1ine
      @dead_1ine 2 года назад +36

      ㅇㅈ

    • @sunhookim9008
      @sunhookim9008 2 года назад +10

      아ㅋㅋㅌㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

  • @shark_let_eat_bee
    @shark_let_eat_bee 2 года назад +89

    개발 초기에 통신값이 계속 미세하게 튀어서 그 당시에 엄청 머리 싸매고 있었는데 float를 사용한 것이 문제였어요.
    진짜 중요한 문제입니다.

  • @lrowitraderlife
    @lrowitraderlife 2 года назад +75

    와 알수없는 유튜브의 알고리즘에 이끌려 왔는데, 딕션 쩌네요. 현직 강사신가? 동영상을 아주 꽉채워서 설명 진짜 잘하셨다.

  • @kokong22
    @kokong22 Год назад +34

    와…. 컴알못인 저를 이렇게 이해하기쉽게 설명해주시다니 감사합니다 ㅠㅠ 엄청나요ㅠ정말 최고입니다

  • @shonelee1871
    @shonelee1871 Год назад +60

    4:43 교훈 = 소수쓰지말고 무조건 100 10000 곱해서 쓰다가 출력은 나누면됨.
    즉 기본베이스 계산은 무조건 정수로 처리되게끔해야함
    참고로 이거 프로그래밍의 기본임.

  • @yourhomefire
    @yourhomefire Год назад +65

    * 컴퓨터에서 숫자를 저장하는 방법 : 이진수 (램에 저장)
    * 소수 0.1등은 2진법으로 변환할 때 무한소수
    * 숫자 하나 저장 bit는 32므로 뒷부분 잘려짐 -> 오차 발생 -> 정확히 0.1을 저장할 수 없음
    * 정수로/반올림/double활용(메모리도 2배)

  • @yoonhoshin3237
    @yoonhoshin3237 2 года назад +136

    신입때 이거 당했는데 실제로 보면 어이없어서 웃음나옴 ㅋㅋㅋㅋㅋ 수업 때 들은 것들 무슨 고대 기계 문명에서 사용했던 지식 같았는데, 실제로 내 앞에 나타나니까 원시인이 지하철 타고있는거 보는 기분이었음

  • @hjrr6471
    @hjrr6471 2 года назад +26

    이런 오분 내외의 컴싸지식 영상 너무 좋습니다 감사합니다

  • @뭅쌤코딩
    @뭅쌤코딩 2 года назад +577

    정말 쉽게 설명해주시네요! 0.1이 이진수로 저장되면 순환소수이고, 32칸에서 컷되는 부분으로인해 오차가 발생한다는 작동원리와 이로인한 문제사례와 해결방법(정수로 변환)까지 완전 이해하기 쉬웠네요. 좋은 영상 감사합니다^^

    • @gun_hyeok
      @gun_hyeok 2 года назад +7

      이게 쉬워요?

    • @완곡한_욕
      @완곡한_욕 2 года назад +69

      @@gun_hyeok 문제 자체는 어려운데 설명을 쉽게 해주셨다는거 같아요

    • @7777lukyaaa
      @7777lukyaaa Год назад +3

      @@gun_hyeok 정확히 뭔소린지는 모르겠는데 아 이래서 그렇구나~ 이정도는 알거같애요

    • @chuimi
      @chuimi Год назад +9

      영상안봤는데 확 이해되네

    • @Luju760
      @Luju760 Год назад +4

      아 정수리로 변환했는데 머리가 없어졋어요

  • @블리-b1z
    @블리-b1z Год назад +84

    좋은 내용 감사합니다.
    실제 개발 할때 정수로 바꿔서 (1.1*10) + (0.1*10) == (1.2*10) 이런 식으로 사용합니다.

  • @핵크랙
    @핵크랙 2 года назад +325

    최대한 부동소수점으로는 연산하지 않는 습관을 들이세요
    별생각없이 짠 decimal 1이 되어야 할 코드가 integer 0이 되어있을겁니다
    (부동소수점으로 바꿔보면 0.99999...)
    반도체장비였다면 그 장비안에 검사도구가 없을경우 웨이퍼 몇백장을 날려먹을수도 있습니다

    • @gandaahtesla5843
      @gandaahtesla5843 Год назад +7

      내 잘못이 아니라 콤푸타 이놈 잘못이군요!

    • @niceyoungmo
      @niceyoungmo Год назад

      가끔 문제되는 경우에 피해서 쓰면 되지 최대한 그럴거 까지야 ㅋㅋㅋ

    • @아쯔이온
      @아쯔이온 6 месяцев назад +7

      ​@@niceyoungmo그 가끔이 ㅈㄴ많이 일어남

    • @niceyoungmo
      @niceyoungmo 6 месяцев назад +3

      @@아쯔이온 경솔하게 짤 경우 인티저도 백분율 계산같은거 잘못하면 "factor(100보다 작은 값) / 100 * percentage (= 항상0)" 같은 오류 공식을 쓸 확률이 높은건 마찬가지입니다. 이런경우 곱하기를 먼저 하기만 해도 해결되긴 하지만 가독성을 우선시한다면 그냥 부동소수점 쓰는게 낫겠죠. 때에 따라 합리적으로 쓰는게 맞는거지 가급적 인티저를 쓰라는 말은 좀 애매한 표현 같아요.
      "부동소수점 연산이 필요없을때는 가급적(혹은 무조건) 인티저를 써라"가 맞는 말이지 "가급적 부동소수점 연산을 피해라"라는 말은 틀린 말인것 같습니다. 부동소수점 연산을 피할 수 없는 게임, 물리 시뮬레이션, 트랜지션 이런거 만들때도 일부러 변태처럼 인티저로 에뮬레이션 코드 짜야될까요? 왜죠? ㅋㅋㅋ

  • @SweetLife-
    @SweetLife- 2 года назад +84

    이 영상 안보고 개발했다가 무고한 희생자가 생길뻔 했네….. 감사합니다.

  • @magnum1062
    @magnum1062 2 года назад +239

    MISRA-C: 2004 Rule 13.3 : Floating-point expressions shall not be tested for equality or inequality.
    MISRA-C: 2004 코딩규칙 13.3 : 부동소수 표현은 같음/다름을 테스트해서는 안된다. (비교연산자 == 와 != 를 사용해서는 안된다.)

    • @mildaejo
      @mildaejo 2 года назад +32

      그렇기에 부동소수 표현 값을 Assert할 때에는 반드시 '허용 오차'를 주어야 한다.

    • @boglaejo
      @boglaejo 2 года назад +20

      이미 60년대에도 fortran에서 반드시 기억해야하는 규칙이었다고 합니다. 70년대에 포트란 배우며 들었던 얘기...

    • @HJ-ri9fj
      @HJ-ri9fj Год назад +6

      ​@@boglaejo 선생님 혹시 포트란 77과 포트란 99를, 유튜브 강좌를 올려주시면 어떨까요?
      많은 사람들이 보거나 남기지 않겠지만 그래도 배우고 싶은 젊은 사람들을 위해 포트란 강좌와 컴퓨팅 역사에 관한 기록물을 남겨주시면 감사하겠습니다.

    • @boglaejo
      @boglaejo Год назад

      @@HJ-ri9fj60년대머에 펀치카드로배웠고제일 많이 쓴것은 vax/vms fortran 이어서 경험이부족하지요 당시에는cobol이흐이던시절이라 두개를 한프로그램에서 불러흐기도 햏는데 이런 편의점들이 이식성을 많이낮추어습니다. 표준도읽은적이있지만 그 태에는posix 작업했었고 fortran 과는작별했습니다. 요약하면 평생강좌를 열 실력에 다다른적이 없어 난처한브탁입니다.

    • @도커
      @도커 11 месяцев назад

      @@HJ-ri9fj싸가지보소

  • @malgang1748
    @malgang1748 2 года назад +35

    유리수는 비교할 때 ==이 아니라 두 수를 빼서 오차범위와 비교하는 식으로 이용하라고 들었습니다. 1.2 - 1.1 < 0.11 이런식으로요.

  • @강경석-c5g
    @강경석-c5g 2 года назад +397

    첨언하자면
    1/3은 0.3333333... 3으로 무한으로 이어진다고 알지만 컴퓨터는 어느 순간 마지막 3을 끊고 특정값으로 설정해야 할 필요가 있습니다,
    (위의 0.1011로 반복되는 예시)
    그렇지 않으면 1/3를 표현하기 위해 모든 메모리 공간을 쓰고도 표현을 할 수가 없기 때문입니다,. (영상에서도 이 얘기가 나왔었죠? )
    따라서 특정 시점으로 끊기는 그 수와 수 사이의 간격을 Machine Epsilon(머신 입실론)이라고 합니다.
    그리고 크롬의 자바스크립트 기준으로 머신 입신론 값은 2.220446049250313e-16 가 나옵니다.
    크롬 콘솔창을 열고 Number.EPSILON를 입력해보세요.

    • @parkypark-m7f
      @parkypark-m7f 2 года назад +5

      추가 설명 감사드립니다. 근데 제가 잘 이해한 것이라면 머신 입실론 값은 "컴퓨터 메모리 한계로 인해 끊긴 수의 값"과 "원래 저장하려 의도한 수의 값"의 차이잖아요?
      그럼 원래 의도한 수가 어떤 수인지에 따라 모신 입실론 값이 달라지는 것 아닌가요?
      크롬 js엔진 기준으로 머신 입실론 값이 특정되어 있다는 뉘앙스로 말씀하셔서 궁금해져 여쭙습니다.

    • @friendship1226
      @friendship1226 2 года назад +7

      @@parkypark-m7f 머신 입실론 값은 "특정 시점으로 끊겨서 나오는 수들의 차이"값이라 보면 되며, "원래 의도한 수"와 "끊겨서 나온 수"의 차이는 적어도 머신 입실론 값보단 작다고 할 수 있습니다.

    • @thearguer5492
      @thearguer5492 2 года назад +2

      지수부 제외하고 가수부만 계산하는 거라 동일해요. 0000....0001

    • @강경석-c5g
      @강경석-c5g 2 года назад +29

      @@parkypark-m7f 제가 설명이 정확하지 않았네요. 의도한 수에 따라 머신입실론값이 달라지는 것이 맞습니다.
      어떤수는 3이 반복되고 어떤 수는 다른 수가 반복되기 때문입니다.
      그래서 친구배님 말씀대로 "원래 의도한 수"와 "끊겨서 나온 수"의 차이는 적어도 머신 입실론 값보단 작다고 할 수 있습니다.
      그리고 이 차이를 통해서 소수점의 크기 비교에 필요한 유틸함수를 만들수 있는데요.
      바로 두 수의 차이가 머신입실론보다 작으면 같은 수라고 판단하는 로직입니다.
      function equal(n1, n2) {
      return Math.abs(n1 - n2) < Number.EPSILON;
      }
      equal(0.1 + 0.2, 0.3); // true
      하지만 이런식으로 소수를 판단하는건 매우 귀찮으니 일반적으로 수와 관련된 라이브러리를 사용하기를 권고하고 있습니다.
      또는 소수가 만들어지지 않는 방식으로 값을 관리합니다. (영상 속 예시처럼 달러-> 센트) 표시처럼이요/

    • @Qwert12o-n1b
      @Qwert12o-n1b 2 года назад +2

      머신 입실론이란 용어는 처음 알게 되었네요.. 입실론은 그냥 작은 수를 나타내는줄 알았는데

  • @strike7even420
    @strike7even420 2 года назад +697

    시뮬레이션 개발의뢰를 햇던적이 있었는데 개발자분이 소수를 무지하게 싫어하시더라구요. 그때는 그냥 계산식중 하나인데 뭐가 문제인거지? 하고 넘어갔었는데 이런 오차가 발생할 수 있었군요. 무릎을 탁 치고 갑니다.!!

    • @Gurumi99
      @Gurumi99 2 года назад +23

      그 개발자가 맡을 깜냥이 아니었던거네요

    • @훵훠이
      @훵훠이 2 года назад +189

      무릎을 탁 치시면 무릎이 아야합니다. 사람은 살면서 많은것을 깨닫고 살죠, 그럴때 마다 무릎을 탁 치시면 무릎의 수명도 탁 하고 나갑니다! 조심하세요~

    • @Gurumi99
      @Gurumi99 2 года назад +1

      @@훵훠이 ㅇㅈ

    • @minsu07311
      @minsu07311 2 года назад +1

      @@훵훠이 ㅋㅋㅋ 그러겠네요

    • @토실권
      @토실권 2 года назад +7

      그래서 전 계란을 탁 쳐서 후라이 해먹습니다 😊

  • @hmin6680
    @hmin6680 2 года назад +112

    A. 부동소수점 연산 과정에서 오차가 있으므로 abs(1.1 + 0.1 - 1.2) < EPSILON 등으로 처리해야 한다.

    • @prussicblack
      @prussicblack 2 года назад +7

      c#으로 테스트 해봤는데...
      double.epsilon 이 더 작습니다. 진짜 epsilon 넣으면 안되고, 적당히 가감해야 할듯.
      var b = Math.Abs((1.1 + 0.1) - 1.2) < double.Epsilon;

    • @hmin6680
      @hmin6680 2 года назад +8

      @@prussicblack 보통의 경우 epsilon을 말할 때 충분히 작은 수라는 의미에서 epsilon을 사용합니다. 말씀처럼 실제 코드에선 적절히 설정해야죠 :>

  • @user-cd9if1ui5j
    @user-cd9if1ui5j 2 года назад +38

    영상보면 너무 답답한 부사수 빨리 이해시키려고 설명해주시는거같아서 너무 머리귀에 박히네요 너무 잘 보고 배우고있습니다 선생님 감사합니다

  • @wasabimat
    @wasabimat 2 года назад +9

    느낌표가 달려 있는 느낌의 억양이네요. 신기.

  • @WhiteTuxedo
    @WhiteTuxedo 2 года назад +20

    수치해석 4시간동안 배우는걸 5분만에 설명해주시네요 ㄷㄷ

  • @설-v4o
    @설-v4o Год назад +35

    개발자도 아닌데 개발이라는 개념을 배우는 게 너무 재밌는듯
    나중에 학생들 개발공부할 때 표본으로 써도 될거같아요

  • @조승희-s7f
    @조승희-s7f 2 года назад +224

    맨날 헷갈리던 개념이었는데 정리 깔끔하게 해주셔서 이해했습니다.

  • @alaraksong8959
    @alaraksong8959 2 года назад +6

    4:40 작은 오차를 보정한다는 핑계로 510센트를 5100센트로 얼렁뚱땅 부풀려 드시는 신종 횡령법!! ㅋㅋ

  • @128beat
    @128beat 2 года назад +78

    대충 저런게 있다는것만 알고있었는데 개발자 15년만에 제대로 이해하게 되었습니다.

  • @compl5956
    @compl5956 2 года назад +4

    뭔가 국어 비문학 기술지문에 나올법한 신기한 이야기군요
    좋은 지식 감사합니다

  • @온천장돌쇠
    @온천장돌쇠 2 года назад +78

    정확한 숫자연산을 위해 다들 Decimal을 사용합시다~

    • @any2999
      @any2999 6 месяцев назад +1

      덕분에 죽을목숨 살렸습니다

  • @fourtytwo-anonymous
    @fourtytwo-anonymous Год назад +17

    그냥 요즘 흔한, CS 지식없이 코딩'만' 배운 사람들은 잘 빠질만한 문제네요.
    4:29 그런데 수치해석 해야하는 경우에는 여기서 말하는 회피수단은 사용 못 하므로 절대값 뺀 후 오차범위 이내인가를 판단 ( |a-b| < eps ) 하는 방법에 대해도 언급했으면 더 좋았을듯 합니다.
    마지막 해법인 double 로 올려본들, 소수점 이하 어딘가에서 저런 문제 생기는 건 똑같거든요.

    • @gandaahtesla5843
      @gandaahtesla5843 Год назад

      24자리로 100시간에 0.34초 오차면,
      62자리(?)로 10000000000000000000000000000000 시간에 0.34초 오차인것 아닌가요?
      100시간으로 따져보면 0.00000000000000000000000000034초 오차인데 이정도는.. 미미한것아닐까 싶기도한데 몇십년동안 계속 구동된다고 해도 유의미한 오차를 관측하기 힘들지 않을까 싶기도 합니다!
      똥몽청이라 계산을 잣같이 했을건데, 지적 후 계산 제대로 해주시면 감사!

    • @2aherj24naedt42t
      @2aherj24naedt42t Год назад

      ​@@gandaahtesla5843 수치해석 하는경우에는 연산시간과 메모리 사용량이 동시에 고려되어야 합니다.
      게다가 시뮬레이션의 스케일이 매우 거대한 천문학(에서도 수치해석을 하려나?) 라던지 MEMS NEMS쪽 시뮬레이션을 할 때는
      기본적인 단위가 10^nn이거나 10^-6 에서 10^-9정도로 이미 자리수를 많이 까먹고 시작하게 되죠.
      그래서 오차 epsilon(eps)를 이용해서 시뮬레이션 스텝을 진행하거나 종료 조건으로 잡게됩니다.
      다만 이 방법은 효율적으로 계산하기 위한 방법이지 "정확"한 해답을 내놓기 위한 방법은 아니긴 하니까 다루는 내용이 조금 다를지도 모르겠네요.
      물론 영상에 나온것과 같이 미사일 궤적 계산 같은 경우는 RTOS라 해서 적절한 정확도로 정시성을 보장하는 계산도 중요한 내용이라 이런 방법을 사용해
      궤적을 분석하고 미사일을 조종할 수 도 있겠습니다.

  • @llIIllIIllIIllIIllI
    @llIIllIIllIIllIIllI 2 года назад +7

    꼼수충입니다. 예전에 어떤문제인지는 정확히 기억나진않지만 롱인티져를 비교할때 문제가생긴적이있습니다. 그땐 단순히 actionscript3에서 버그가있다고 생각했는데 시간은없고 빠르게해결해야했기에 스트링변환후 반으로자르고 각각을 비교해처리한적이있는데 소수점기준 스플릿나눠서 정수로 비교해도되긴합니다. 이상 꼼수충이었읍니다

  • @Retis1
    @Retis1 2 года назад +79

    꿀팁 : 소수 곱셈 할 때 오차가 많이 발생하는데 이런 연산들은 log 연산으로 치환하면 오차를 많이 줄일 수 있다

    • @준영-r2h
      @준영-r2h 2 года назад +1

      이거지 ㅋㅋ

    • @d2341a
      @d2341a 2 года назад +6

      팁 : 소->팁: 소

    • @usernameemrix
      @usernameemrix 2 года назад +1

      @@d2341a 이것도 규칙이 있었어?

  • @가츠동-o6d
    @가츠동-o6d 2 года назад +8

    저도 이거 좀 헷갈리던 개념이었는데 쉬운 설명 감사합니다.

  • @pomegranate_b
    @pomegranate_b 2 года назад +9

    ㄷㄷ 패트리어트 100시간 넘게 켜두면 안되는군요... 좋은정보 얻고 갑니다

  • @jeslee2527
    @jeslee2527 2 года назад +7

    저래서 수치해석 할 땐 어떤 값이 반복 계산 끝에 수렴했는지를 입실론이라는 지정한 작은 숫자보다 작은지로 판단합니다,,

  • @green_dollar_sign
    @green_dollar_sign 2 года назад +9

    사실 프로그램에서 소수는 뒤에 찌꺼기가 남는다 정도만 알고 있었지 정확히 이유는 몰랐는데
    이진법의 순환 소수 문제 때문이란건 처음 알았네요

  • @JNS__99
    @JNS__99 Год назад +34

    컴퓨터공학 다니는 재학생입니다. 2학년인데 IEEE는 배웠지만 저런 개념은 처음 들었습니다. 진짜 많은 도움되었습니다 감사합니다

    • @fourtytwo-anonymous
      @fourtytwo-anonymous Год назад +8

      IEEE 754 에 다 나오지만 2학년 시점에서 설명들어도 솔직히 실감은 안 갈거고, 수치해석 이런 과목 하면서 저런 문제 실제 맞딱드려야 와닿긴 하죠

    • @8528845444555
      @8528845444555 Год назад +4

      컴구조하면 배워요

  • @이소연-s2e8g
    @이소연-s2e8g Год назад +126

    1.1 + 0.1 == 1.2
    > false
    왜냐면 10진법=>2진법 변환시 0.1은 순환소수. 메모리때문에 32칸에서 잘리므로 오차 발생.
    1. 정확히 계산하려면 정수로 (예: 5.1달러 -> 5100센트)
    2. Float 써야하는 상황이 생기면 반올림 문법 적절히 활용
    precision = Math.pow(10,precision)
    Math.ceil(num*precision)/precision
    3. double 자료형 : 숫자 1개당 64칸 사용 - 단점: 메모리 용량 2배

  • @grayliar147
    @grayliar147 2 года назад +6

    이런 영상의 강의 좋은거 같아요 많이 만들었으면 좋겠네요

  • @cheese-s6t
    @cheese-s6t 2 года назад +1

    와 그냥 썸네일만 보고 뭐가 문제인지 생각하고 안볼라 했었는데 보길 잘했네요 대머리를 두둥탁 치고 갑니다!!

  • @MoveGreen_Youtube
    @MoveGreen_Youtube 2 года назад +84

    1:52 여기서 소숫점 앞의 1을 왜 저장 안하는지 궁금하실지 모르실텐데, 0을 제외한 거의 모든 수는 이진법으로 치환하면 저렇게 1이 꼭 하나 나옵니다. 그래서 저거를 비트도 아끼고 한자리라도 더 나타내야하니 생략하자! 가 되어버려서 그런겁니다. 이 때문에 IEEE 754 프로토콜을 가진 컴퓨터는 궁극적으로 0을 나타낼 수 없게 됩니다. 생략되는 1 하나 때문에 그냥 0에 무한히 가까운 수만 나타낼 수 있습니다.

    • @tubeyou1490
      @tubeyou1490 2 года назад +3

      거의 모든 수인 이유가 있을까요? 0을 제외하면 모든 수여야 할거 같은데 거의라고 표현하셔서 써봅니다. 0으로 시작하면 소수점 자리를 1이 나올때까지 뒤로 옮길 수 있으니 말씀하신대로 맨 앞은 1로 시작하게 되겠죠. 예외상황이 있는지 궁금합니다.

    • @yacht-responce
      @yacht-responce 2 года назад +4

      @@tubeyou1490 0이 아닌 모든 이진수 k는 1.nnnn × 2^m 의 형태를 갖게 됩니다. 뒤에 2의 몇승을 곱하는 이유가 그렇게 나타내기 위해서에요. 경우의 수를 나눠볼까요.
      i) | k | >= 1:
      절대값이 1보다 크거나 같은 실수라면 소수점 위는 무조건 정수 형태를 띄죠. 근데 이진수 정수의 가장 높은 자리 숫자는 항상 1입니다. 4 = 101(2) 를 4 = 0101(2) 라고 적지 않죠. 맨 앞에 값이 없는 0은 몇 개를 적던 똑같기 때문에 생략하게 되고, 따라서 k = 1.??? × 2^m 의 형태가 됩니다. 참고로 4 = 101(2) 에서 중간의 0은 자릿수를 나타내기 위해 꼭 필요한 숫자입니다.
      ii) 0 < | k | < 1
      절대값이 1보다 작은 실수여도 마찬가지입니다. 2의 몇승만 해주면 i)과 같아집니다. 따라서 k = 1.??? × 2^m 형태가 됩니다.

    • @yacht-responce
      @yacht-responce 2 года назад +5

      @@tubeyou1490 한마디로 0 이외의 모든 수는 2의 "몇제곱" 값을 조절하면 1.xxx 형태로 나타낼수 있습니다. 예외가 없도록 표현을 그렇게 하게 돼있어요.

    • @tubeyou1490
      @tubeyou1490 2 года назад +1

      @@yacht-responce 제 표현을 잘 읽어주세요. 원 댓글님이 거의라고 해서 왜 모든이 아닌 거의라고 표현한건지를 물어본겁니다. 님께서는 그냥 모든이라고 해서 제 생각과 같으신건 이해했습니다.

    • @quiraxical
      @quiraxical 2 года назад +1

      0의 표현을 위해 지수부의 특정 값을 예약값으로 사용합니다. 예를 들어 지수부가 모두 0인 경우 0으로, 모두 1인 경우 무한대로 간주합니다.
      0을 제외한 모든 수는 위의 다른 분들이 설명하신 대로 정규화하여 1.xxxx x 2^n 꼴로 나타낼 수 있으므로, xxxx와 n만을 저장하는 것입니다.

  • @justice4323
    @justice4323 Год назад +1

    어떻게 영상 하나 하나가 주옥같습니다 형님..

  • @daredevone
    @daredevone Год назад +175

    Java에서는 double도 오차가 있습니다. 그래서 financial organization 현업에서는 precision을 절대 상수로 정의하고 지키시던가, 처리 속도가 엄청나게 중요한게 아니면 BigDecimal을 쓰면 편합니다. 좋은 영상 감사합니다.

    • @IllIIllIlIIIlI
      @IllIIllIlIIIlI Год назад +21

      모든 언어에는 double오차 있어요
      영상에서도 오차의 범위가 줄어든다고 말해요
      없다가 아님

    • @daredevone
      @daredevone Год назад

      @@IllIIllIlIIIlI 강의하신 분이 아니라 많은 개발자들이 잘못 코드하시는걸 두고 말씀 드린것이예요.

    • @IllIIllIlIIIlI
      @IllIIllIlIIIlI Год назад +9

      @@daredevone 아.. 넵 ^^

    • @moonan2
      @moonan2 Год назад +11

      @@IllIIllIlIIIlI ㅋㅋ논리적인 대화가 불가능하다는것을 인지하고 눈웃음으로 마무리하시는 센스

    • @LITTLE04
      @LITTLE04 Год назад +6

      ​@@moonan2ㅋㅋㅋ ㄹㅇ 말귀를 못알아먹어서 딴소리하네

  • @민기김-e6i
    @민기김-e6i Год назад +1

    아직 영상 다 안 봤지만..
    컴퓨터에서 특정 소수는 정확히 표현할 수 없음. 근사값을 찾아갈 수는 있을 뿐.
    그래서 == 라는 수식을 사용하는 해야 한다면 값을 직접 봐야 할 필요가 있고, 아니라면 범위 안에만 들어오면 맞도록 조건식을 작성해야 함.

  • @O-ri
    @O-ri 2 месяца назад +10

    4:44 잠깐 이제 알았는데 5.1달러면 510센트 아님????

    • @한국_kr
      @한국_kr Месяц назад

      그렇네 ㅋㅋ

  • @dokidoki_jajingjjang
    @dokidoki_jajingjjang 3 месяца назад

    내가 인터넷에서 본 부동소수점 설명중 가장 명쾌함. 모두의 코드랑 투탑 ㅋㅋ

  • @user-d9412ng2nfx
    @user-d9412ng2nfx 2 года назад +6

    와 사이드플젝할때 왜 자꾸 가격계산할때 특정하게 무한소수값이 나오나했더니 이런원리가 있었네요;; 코드만하다보니 CS지식이 다날아가버렸군여ㅜㅜ 감사합니다..

  • @mollruu
    @mollruu Год назад +2

    저도 미래에 개발자가 될 건데 정말 유익한 영상이네요

  • @lambda546
    @lambda546 2 года назад +4

    좋은 정보 감사합니다

  • @juhwang79
    @juhwang79 5 месяцев назад

    작지만 너무나 중요한 이슈 영상 감사합니다! 이 영상이 수많은 사람들을 살리네요!

  • @neoeobz
    @neoeobz 2 года назад +19

    10진수가 2진수로 변환될때 소수일때만 무한소수로 나타는 경우의 예시까지 깔끔한 설명 좋네요..

  • @turbluetube
    @turbluetube Год назад

    설명하시는 분 목소리와 억양이 정말 특이합니다. 재밌게 봤어요.

  • @se_787
    @se_787 2 года назад +3

    코딩애플 사이트에 cs 강의도 추가됐음 좋겟네요 센세

  • @jungminlee4555
    @jungminlee4555 Год назад +1

    좋은 설명 감사합니다 이해가 쏙쏙 되네요!

  • @melonaaah
    @melonaaah 2 года назад +3

    난 코딩에 관심도 없는 사람인데 왜 이곳에... 여긴 어디지... 하지만 진짜 신기한거 배워갑니다

  • @user-anamtree
    @user-anamtree Год назад

    사람 쥬거,, ㄷㄷㄷㄷ
    이런 사례 들려주시니까 머리속에 꽉 박히네여 ㄷㄷㄷ
    항상 감사합니다 코애님 ㅠㅠㅠ

  • @smileman4323
    @smileman4323 Год назад +4

    잘 배우고 갑니다.
    한편 5.1달러는 5,100센트보단 510센트에 가까울 것 같네요.

  • @no1spirit
    @no1spirit 11 дней назад

    좋은 내용 감사합니다. 사소하게 틀린부분이 하나 있는데, 4:41에 5.1달러는 5100센트가 아니라 510센트로 고쳐야 하겠네요.

  • @jasok5225
    @jasok5225 2 года назад +94

    여기서 나온 방법 외에 충분히 작은 숫자를 이용하는 방법도 있습니다.
    예를 들어 1.1+0.1과 1.2 비교할때
    1.1+0.1 -1.2

    • @user-vj9vu5yg8c
      @user-vj9vu5yg8c 2 года назад +26

      소수 사용을 지양하는게 최고의 방법입니다

    • @llPMPll
      @llPMPll 2 года назад

      그냥 소수점 쓰지마요 ㅡ.ㅡ;;; 교수가 안 가르쳐 줘요?

    • @jasok5225
      @jasok5225 2 года назад +38

      댓글 남겨주신 것처럼 소수 사용을 지양하는 것이 최고의 방법이나, 그렇지 못한 경우에 사용하는 방법입니다.
      예를 들어, 자신이 다루고 있지 않은 블록에서 넘어온 값을 받아서 처리를 해야하거나
      소수가 포함된 외부 데이터를 분석해야하는 경우들이 그런 경우에 해당할 수 있습니다.

    • @segubeam
      @segubeam 2 года назад +44

      @@llPMPll 말 왤케 짜증나게 하지 좋게 해도 될 걸

    • @tiho-nge60r-rttj
      @tiho-nge60r-rttj 2 года назад +58

      @@llPMPll 지금 소숫점을 써야되는 상황에서 어케 대처할까 얘기중인데 갑자기 소숫점 쓰지말란 헛소리가 왜튀어나옴?? 이새낀 밥 뭐먹지 고민하는데 달려와서 아 밥먹지마요 이ㅈㄹ할듯ㅋㅋㅋㅋ 주변에서 눈치없단 얘기 자주듣지?

  • @김밥말자-s3n
    @김밥말자-s3n 2 месяца назад

    첨 들었을땐 이런게 있구나 싶었는데 전공시간에 배우고 들으니 새롭네요 ㅋㅋㅋ

  • @kkw2401
    @kkw2401 Год назад +8

    개발자가 명심해야하는 것도 있지만 엔드유저 역시 기기를 장시간 사용했을 경우 에러가 누적되기 때문에 주기적으로 재부팅해줘야 하는것도 있어요. 당장 스마트폰 사용시간 보시면 일주일 이주 삼주 넘어가는 분들 많을 겁니다. 스마트폰 정도야 큰 불편함은 없겠지만 센서류 간혹 먹통될 경우에는 재부팅은 필수!

  • @dormouse24
    @dormouse24 2 года назад

    섬네일과 제목에 홀리듯 들어왔는데 재밌고 유익한 내용이었네요 이래서 제 코드에 맨날 오류가 났었군요

  • @amour2615
    @amour2615 2 года назад +6

    비전공자입니다
    2:00 에서 왜 2+127을 하나요?
    영상 감사합니다

    • @kimjunsik540
      @kimjunsik540 2 года назад

      그러게요

    • @cute_12447
      @cute_12447 2 года назад

      와드

    • @codingapple
      @codingapple  2 года назад +1

      지수가 -127까지 나올 수 있는데
      음수까지 표현해서 저장하기 귀찮아서요

    • @kimjunsik540
      @kimjunsik540 2 года назад

      @@codingapple 아하 생각해보니 그렇네요

    • @vVvvVVvvv373
      @vVvvVVvvv373 2 года назад +2

      귀찮아서라기보다, IEEE 표준 계산 방식이라 보면됩니다. 정규화(소수점 이동) 후에, 단일정밀도의 경우 8비트로 만들기 위해 bias 값인 127을 더해줍니다. 정밀도에 따라 할당되는 각 영역에 바이트도 다르고 지수부에 더해지는 bias 값도 달라진다고 생각하시면 됩니다.

  • @멍멍이-z8j
    @멍멍이-z8j 2 года назад +2

    아주 좋은 토픽 잘 듣고 갑니다. 저도 MCU 펌웨어를 C로 주로 짜는데 소수점을 사용할 일이 있으면 offset 적용합니다

  • @salm2000
    @salm2000 2 года назад +11

    C++ 이나 C# , 자바, PHP 등에서는 아예, MATH 라이브러리가 있습니다.
    거기에서 무한수 함수가 포함되어 있으니 그거 쓰면 진짜로 오차가 많이 줄어듭니다.
    근데 메모리를 더블 형보다 더 많이 잡아먹습니다.

    • @takarai99
      @takarai99 Год назад +1

      그래도 치명적인 연산 실수를 줄일 수 있으니 상당히 유용하네요.

  • @bss1609
    @bss1609 10 месяцев назад +1

    설명GOAT

  • @이근주-u3l
    @이근주-u3l 2 года назад +10

    그래서 환율까지 들어가서 소수점이 중요한 핀테크 업계에서는 1.1+0.1==1.2로 쓰면 안 되고 1.1+0.1-1.2==0으로 써야함

  • @AppleKiwi27
    @AppleKiwi27 2 года назад +1

    설명 미쳤네 겁나 잘한다

  • @김안녕-v3n
    @김안녕-v3n 2 года назад +3

    쓰앵님들 궁금한 거 있습니다 부동소수점 지수부 저장할 때 127을 더하는 이유가 뭔가요? 8칸을 할당하는데 지수부가 0일 때만 01111111로 앞자리가 0이고 나머지는 1로 시작하기 때문에 이 케이스를 빠르게 구분하기 위해서인가요?
    그리고 생각하다보니 컴퓨터는 각기 자료형에 따라 할당하는 비트가 달라서 애초 물리적으로 32비트 혹은 64비트마다 표지하는 건 불가능하고, 매번 가변적으로 한 데이터의 끝과 시적점을 구분해야 할 텐데 이런 과정은 어떻게 이뤄지나요? 구체적으론, 생물에서의 개시 코돈이나 종결 코돈처럼 '여기서부터 한 문단 끝났고 다음부터 새로운 맥락이다' 라는 구분이 명확히 없어보임에도 특정 주소에 저장된 1은 '아 이전 변수값은 끝났고 이건 다음 변수인 float 5.7의 부호부군' 라는 걸 어떻게 구분하나요?

    • @higstudev
      @higstudev 2 года назад

      지수부가 음수인 경우를 따지려고 512의 절반만큼 밀어두는거로 알고있습니다

    • @Aas-vb8wi
      @Aas-vb8wi Год назад

      포인터와 메모리 구조를 공부하시면 궁금한걸 해결하실 수 있을거에요.
      메모리 0번 주소가 첫 8비트를 가르키고, 1번 주소가 두번째 8비트, 이런식으로 가르킵니다. 포인터는 시작 주소를 저장하며, 포인터의 자료형이 시작 주소로 부터 몇 바이트를 읽을지를 결정합니다. 그리고 배열 및 malloc, new 등으로 할당한 매모리 영역은 시작 주소 바로 앞 주소에 이 자료형에 메모리가 몇바이트 할당되었는지 정보를 담아둡니다.
      int a = 1 이렇게 써도 컴파일러가 엄격한 규칙을 바탕으로 스택 영역에 할당할 뿐이지 접근법은 포인터와 같습니다.(사용자가 선언한 포인터는 힙에 저장됨) 다만 그냥 변수로 선언하면 값복사가 일어나지만, 포인터는 복사 없이 바로 참조하여 속도가 빠르다는 차이가 있습니다.

  • @MsTuring
    @MsTuring Год назад

    2000학번 컴공과 아재입니다.
    이런건 재인생에 처음 봅니다만 너무 유익했습니다.
    이 단순한 이유를 아직도 몰랐다는 사실에 뒤통수가 얼얼하지만
    정말감사합니다.

  • @AlwaysNiceDay
    @AlwaysNiceDay 2 года назад +42

    예전에 프로젝트로 여러 방법으로 원주율을 계산하는 프로그램을 만든 적이 있는데, 이것 때문에 미칠뻔 했죠.
    덕분에 vc++ 프로젝트 지우고 g++로 다시 작성했습니다. double로는 부족한데 vc++이 boost float128을 못 쓰더라고요.
    많이 힘든 프로젝트 였지만 덕분에 boost 사용법도 배우고 부동소수 연산할때 Epsilon도 배웠네요.
    그리고 한번 c#으로도 작성해 보았는데 매우 쉽게 되더군요. "이러면 내가 c++로 1주일 동안 노력한게 뭐가 되지?"라는 생각이 들며 그 뒤로 주로 c#을 쓰고 있습니다.

    • @King_God
      @King_God 2 года назад +2

      C#이 숙달만 하면 기능도 많고 편리하긴 하죠..많이 무겁지만..

    • @AlwaysNiceDay
      @AlwaysNiceDay 2 года назад +1

      @@King_God 확실히 c++이 테스트 했을 때 몇배는 더 빠르고 cpu 자원도 덜 쓰더라고요

    • @lunarlight9999
      @lunarlight9999 2 года назад

      c++++ > c++

    • @manai2683
      @manai2683 2 года назад

      기승전결 c#

    • @lunarlight9999
      @lunarlight9999 2 года назад

      @@manai2683 ㅋㅋㅋㅋ 초창기때 c# 하고 자바만 했는데 추억..

  • @부띠-w5d
    @부띠-w5d 2 года назад

    너무 재밌어요😆!
    쉽게 설명해주셔서 감사합니다!!!

  • @사과의맛
    @사과의맛 2 года назад +3

    매우 중요한 내용을 알려주셔서 감사합니다

  • @G47_Code
    @G47_Code Год назад +1

    진짜 재밌게 잘 설명해주셔서 감사합니다

  • @brave_one
    @brave_one 2 года назад +15

    와 너무 쉽게 설명하신다! 질문있습니다. 소수를 문자열 포맷으로 통신하는 경우도 있더라구요. 몇몇 API를 사용하다 그런 케이스를 보았습니다. 문자열로 저장했을 때 정확도가 보장되는 것 때문으로 추측했습니다. 그런데 문자열은 용량을 많이 차지 할 것인데 문자열로 보내는 이유가 있을까요? 제가 생각하기에 영상에서 말씀하신 double 형태로 보내더라도 결국 시스템 상황에 따라서 해당 자료형의 사이즈가 환경에 따라서 다르고 처리 방식 또한 다르기 때문에 값의 무결성을 지키기 위해서 용량을 차지하더라도 문자열로 보내는 걸까요?

    • @ktm2718
      @ktm2718 2 года назад

      애초에 통신 자체는 문자열로 하고, 부동소수점에 해당하는 문자열은 해석하는 과정을 거쳐 메모리에 저장을 하므로, '전송 전 문자열 변환 -> 통신 -> 수신 후 소수점 해석'의 과정을 거치는 것 보다 통으로 문자열로 다루고 '문자열 전송 -> 통신 -> 수신 후 소수점 해석'의 과정을 거치는 게 더 간결한 것도 있겠습니다.

    • @dinobei89
      @dinobei89 2 года назад +4

      개발자의 성향에 따라 다른걸로 이해하시면 될것같습니다. 문자열로 보낼지, ASCII로 보낼지, 4/8바이트 표현 그대로 보낼지는 자유입니다. 문자열로 보내면 수신한 데이터를 float, double 형태로 변환하는 추가적인 과정(비효율)이 생기겠지만, 수신측에서 데이터를 받고 아무 처리 없이 바로 로그를 출력했을 때 사람이 이해할 수 있는 형태로 표현되어 편의상 선호하는 개발자도 있는 것 같습니다.

    • @Retis1
      @Retis1 2 года назад +3

      JSON 포맷말인가요? JSON 은 그냥 단순하고 특정 기술에 비의존적이고 개발자가 읽기 쉬운 포맷이라 많이 이용될 뿐이고 정확도가 중요하면 다른 방식으로 통신할겁니다.
      애초에 JSON 이 아니라도 문자열로 소수를 보내는건 다 비슷한 이유일거에요

    • @jiwoonkim6781
      @jiwoonkim6781 2 года назад +1

      보통 API는 텍스트기반 전송이기 때문에 문자열로 전송하는 것 뿐이지 다른 이유는 없습니다. 게다가 요즘엔 압축이 보편되어있어 효율도 나쁘지 않구요.

    • @hmin6680
      @hmin6680 2 года назад +2

      통신시 양방 시스템간의 메모리 저장 방식(빅/리틀엔디언)에 따른 차이가 발생하더라도 그 값이 보장되어야하므로 문자열 전송을 원칙으로 합니다.

  • @TeaHeelove
    @TeaHeelove 2 года назад +2

    코딩에 코자도모르고 아마 앞으로 모를거같은데 영상 재밋어서 끝까지 다봄

  • @arcturtle
    @arcturtle 2 года назад +4

    1줄요약 : "부동소수점 방식 자료형에서 흔히 일어나는 오차입니다."

    • @d2341a
      @d2341a 2 года назад +1

      약 : "->약: "

  • @manai2683
    @manai2683 2 года назад +1

    그 외에도 뭐 라운딩을 습관화한다던가 꼭 필요할 때는 인터넷에서 좀 더 나은 comparer를 찾아본다던가 하는 방법이 있겠네요
    ...솔직히 평상시에는 이렇게까지 하나 싶지만 생각해보니 저도 신경쓸 필요가 있는 경우가 종종 있었네요

  • @kiseoky
    @kiseoky 2 года назад +19

    영상 정말 잘봤습니다. 영상을 보고 궁금증이 생겨 실례를 무릅쓰고 질문 드리고 싶습니다.
    Q1. 0.125 같이 깔끔하게 2진법으로 변환되는 수들을 사용하면 오차가 발생하지 않게되나요?
    Q2. 이런 오차가 더 큰 값으로만 일어나는 이유가 있을까요?
    예) 1.1 + 0.1 > 1.2

    • @hhh-pd1rn
      @hhh-pd1rn 2 года назад

      Q2 는 저도 궁금합니다!!

    • @cheongladies2790
      @cheongladies2790 2 года назад +9

      1. 순환소수 문제가 안 일어나는 수는 오차가 없습니다.
      2. 오차가 큰 쪽으로 일어나기보단 저장공간 내에서 허락하는 가장 비슷한 수로 저장이 됩니다.

    • @마핌
      @마핌 2 года назад +8

      A1. 2진법과 10진법의 변환시에 2의 제곱을 통해서 변환을 하는데 0.125는 1/8이라서 딱 2의 -3승입니다.
      A2. 10진법 순환소수를 통해서 이해하면 됩니다. 순환소수는 n/9, n/99등으로 무조건 n/10^m보다 큽니다. 1/9=1.1111...을 생각해봅시다. 소수를 절삭한다면 소수점 아래 n째 단위로 끊습니다. 소수점 아래 첫째짜리에서 끊는다면 1.1이 되고 1.1(10진수의 1.1)은 1.111...(2진수의 1.1 비유)보다 작죠? 두번째 자리에서 끊어도 1.11이 되고 이는 1.1111...(2진수의 1.1 비유) 보다 작죠?

    • @강경석-c5g
      @강경석-c5g 2 года назад +12

      1.1은 실제 저장된 값을 보면 1.100000000X로 표현됩니다,
      실제 값과 저정된 값의 차이는 머신입실론이라고 하는데 1.1의 머신입실론과 0.1의 머신입실론의 합이 1.2의 머신입실론보다 크기 때문에 그렇게 표현됩니다.
      하지만 1.1 + 0.1 > 0.8 + 0.4 의 결과는 false입니다. 0.8 + 0.4의 머신입실론 값이 더 크기 때문입니다.
      따라서 더 큰값으로만 일어난다고 할 수 없습니다,

    • @남경찬_4352
      @남경찬_4352 2 года назад +4

      1. 이러한 오차가 일어나는 이유는 '정밀도 손실' 때문입니다.
      1번에서 질문하신 2진법으로 변환되는 수들을 사용하여 계산을 한다고 해도, 1.2222222 와 같은 무한소수의 값을 얻게 됩니다.
      한마디로 10진법이든 2진법이든 1.2를 정확하게 계산하는 방법은 없습니다.
      이유는 c, java, javascript, ruby 등이 IEEE-754로 표현되기 때문입니다.
      Q. 그럼 해결 못하는 건가요?
      어림수를 구하면 됩니다.
      let sum = 1.1 + 0.1
      console.log( +sum.toFixed(2) );
      무한소수를 완벽하게 잘라내는 방법은 없습니다. 단순 꼬리 잘라 어림수를 만든 편법입니다.
      2. 윗분들이 자세히 설명해주셨네요.
      보잘것 없지만 설명을 좀 해드리자면,
      1.1 + 0.1 > 1.2 와 같은 대소비교가 되는 이유는
      간단하게 1번의 내용과 같습니다
      1.2222222 > 1.2 이렇게 보시면 편합니다.

  • @앵무새-v1e
    @앵무새-v1e 2 года назад

    영상 처음 보는데 재밌으면서 귀에 떄려박는 목소리라 좋네요

  • @Danny-sj1yz
    @Danny-sj1yz 2 года назад +3

    4:37 5.1 달러 = 5100 센트가 아니라 510 센트

  • @bittim3688
    @bittim3688 2 года назад +3

    4:34 5.1 곱하기 100 = 510

  • @ff_gg-fm9db
    @ff_gg-fm9db Год назад

    와 오늘 수업 내용 공부하다가
    유튜브 켰는데 알고리즘으로 이 영상이 떠버리네
    이해가 안갔는데 정말 감사합니다

  • @안태현-s2i
    @안태현-s2i 2 года назад +5

    1.1f + 1.1f == 1.2f 하면 트루나오네요 ㅋㅋ .f 기계적으로 쓰고는있었는데 이런걸 방지해줄줄은.... 부동소수점은 고속역제곱근이 제일 재밌는거같아요 이것도 다뤄주실수있나요?

  • @민기-q1v
    @민기-q1v 2 года назад +20

    요약: 10->2진법 변환 한계로 0.1표현이 제대로 안됨 따라서 연산 후 결과를 비트연산하게되면 다른값이 나올 수 있다

    • @facts6321
      @facts6321 2 года назад +12

      중요한건 왜 다른값이 나오는가이다

  • @5tormtr0093r
    @5tormtr0093r 2 года назад +1

    스마트팩토리 플젝할때 같은 로그 학습시켜도 언어별로 소수점 3자리를 다르게 뽑아내서 이거 뭐임 했었다가 해결을 하긴 했는데
    이렇게 깊은 뜻이... 이해해 버렸다...
    패트리어트는 정말 첨 들어보는 이야기네요 썰풀기 좋네요
    수업료 좋댓구알 입력합니다

  • @devenvbok6153
    @devenvbok6153 2 года назад +10

    First the languange has some effects on the outcome. Just seeing the IDE, you are using the chorme dev tools. Thus 1.2 == 1.2 They are both the floating numbers. thus 1.2 === 1.2. "==" compares the types and "===" compares the actual valvues

  • @junsang09
    @junsang09 6 месяцев назад

    썸네일 보자마자 영상 더 볼것도 없이 부동 소수점이 생각나네요. 안나면 프로그래머 아닙니다! 저 파이썬 대화형 뭐시기 하는건 부동소수점(float) 연산을 사용하기때문에 저런 문제가 발생하죠.

  • @jkl701
    @jkl701 Год назад +8

    코더가 컴퓨터의 비위를 맞춰줘야 하는 시대가 빨리 지나가버렸으면 좋겠네요.

    • @silll3132
      @silll3132 Год назад +1

      그순간 일자리를 잃을듯

  • @jaehyunko7623
    @jaehyunko7623 2 года назад

    2:43 뒷부분을 컷(버림)하면 작아져야하는거 아닌가요??
    float a = 0.1, b = 1.1;
    a+b < 1.2
    이렇게 되어야할거같은데
    실제론 a+b > 1.2 가 되는데
    단순히 컷(버림)이 아니라 반올림?올림?으로 처리가 되나요?

  • @lazlostyle560
    @lazlostyle560 2 года назад +5

    실제로 공급가액 세액 분리할때
    (부가세포함)
    5000원 / 11 = 세액
    5000 / 11 * 10 = 공급가액
    이런식으로 처리함

  • @bennyspapa9510
    @bennyspapa9510 2 года назад +1

    저거 피하는 방법으로 훨씬 쉽고 더 많이 쓰는걸 언급 안하셨는데 == 대신에 >= 요런식으로 풀어서 비교를 하게 합니다
    그리고 제일 중요한게 대부분 조건문에서 저런 비교문을 만이 쓸텐데 왠만하면 실수로 비교문을 짜지 않아야 합니다 정수비교랑 속도차이가 어마어마하게 납니다
    그게 아니어도 애초에 ==비교는 float자료형에서 쓰면 절대 안됩니다

    • @d2341a
      @d2341a 2 года назад

      왠만->웬만

  • @jwagent3130
    @jwagent3130 2 года назад +31

    임의의 ε > 0 에 대하여 |x-y|< ε 이면 x==y로 간주하는 식으로 충분히 작은 입실론 ε 값을 상수로 정의해두고 비교하기도 합니다.
    상황에 따라 다르지만 정수치환하는 게 보통은 더 가벼운 연산이라 좋습니다

    • @ihany9061
      @ihany9061 2 года назад +1

      임의의 eps > 0 -> 충분히 작은 eps > 0

    • @wickkid41
      @wickkid41 Год назад +1

    • @민우-w2e
      @민우-w2e Год назад +2

      @@ihany9061 임의의가 원래 맞는 정의임

    • @anzac_9425
      @anzac_9425 Год назад

      입실론이 아닌 엡실론 아닌가요? 그리스 문자중에는 엡실론과 입실론 둘 다 있어서요

    • @user-e5m6f
      @user-e5m6f 11 месяцев назад

      ​@@ihany9061 충분히 작다라고 하면 컴퓨터는 못 알아먹어 수학과야

  • @totoistk
    @totoistk 7 месяцев назад +1

    근데 궁금한게있습니다. 특정지점에서 끊어버린다면 0.1은 실제로 0.9999..어딘가쯤으로 저장이되는건데, 왜 1.1+0.1 의 결과는 1.2 보다 큰가요? 더 작아야하는거 아닌가요? 0:08 이거 이유를 여전히 모르겠습니다

    • @오치치577
      @오치치577 5 месяцев назад +1

      더 크게 저장될 수도 있습니다.

    • @totoistk
      @totoistk 5 месяцев назад +1

      @@오치치577 그러니까 다들 그렇게만 말을하고 구체적으로 왜 를 알려주는 사람이없어요 ㅠㅠㅠ

    • @totoistk
      @totoistk 5 месяцев назад +1

      @@오치치577 Mantise 가 23비트니까 실제로 저장한값은 2^-24 + 2^-25 ...만큼의
      차이가 “적게” 나야하는데, 이게 대체 무슨원리로 크게 저장이 될수있는겁니까....

    • @오치치577
      @오치치577 5 месяцев назад +2

      이진 기준으로 소숫점 아래 23번째 자리까지만 나타내는데 이때 소숫점 아래 24번째 자리에서 오사오입(짝수-반올림)해서 나타냅니다. 예를 들어, 십진수 0.6은 이진법 수로 0. 1001 1001 1001 1001 1001 1001 ...인데 24번째 자리에서 오사오입 해서 0. 1001 1001 1001 1001 1001 101 로 저장이 됩니다.

    • @오치치577
      @오치치577 5 месяцев назад +1

      @@totoistk 다른 예시로, 0.1+0.2=0.30000000000000004가 나옵니다.

  • @hhs6050
    @hhs6050 2 года назад +3

    Java 에서 Long -> BigDecimal 로 자릿수를 늘려서(형 변환 시) 저장을 할때 65.9 -> 65.90000000001 이런식으로 변환이 될 떄가 있던데 영상과 같은 이유일까요?

    • @jiwoonkim6781
      @jiwoonkim6781 2 года назад

      어떻게 하셨는진 모르겠지만 BigDecimal.valueOf 로 한게 아니라면 해보시길 바래요

  • @mystic6197
    @mystic6197 Год назад

    설명을 되게 간단 명료하게 잘해주시네요

  • @시
    @시 2 года назад +4

    파이썬에서 1인 줄 알았는데 1.000000002 이래 돼 있어서 1이랑 다르던거 기억나네

  • @AK103-23
    @AK103-23 Год назад

    코딩 정작 하지는 않는데 이런 영상 너무 재밌네요
    내가 책임지고 업무 해야하는게 아니라서 그런가 ㅋㅋㅋㅋㅋ

  • @김현형-z3o
    @김현형-z3o 2 года назад +802

    이 영상 안봣으면 죽을뻔했네;;

    • @Tech-ii9ze
      @Tech-ii9ze 2 года назад +8

      ㄹㅇ.. .

    • @sandapilarius
      @sandapilarius 2 года назад +4

      ㄹㅇㅋㅋ

    • @김동진-y7q
      @김동진-y7q 2 года назад +5

      ㄹㅇㄷㄷ

    • @intercomb
      @intercomb 2 года назад +6

      나 살아버렸어..

    • @MN-do7hk
      @MN-do7hk 2 года назад +28

      앞으로 매일 아침마다 코딩애플 형 있는곳 방향으로 절 세번해야겠다

  • @보바-p5l
    @보바-p5l Год назад

    와씨 개꿀잼 바로 노션에 정리하고 구독박았다

  • @kkkoung
    @kkkoung 2 года назад +6

    아! 그래서 코인들도 최소 단위가 있는거였군요!!
    감사합니다

    • @fireeggkimpaul4758
      @fireeggkimpaul4758 2 года назад +1

      아하!! 정말 맞네요! 👍👏👏
      예를 들어서 $100 = 0.1232 bitcoin --> 이런식으로 표현하는 이유가 있었네요!

    • @NullPointerException00
      @NullPointerException00 2 года назад +2

      아뇨 그건... 그냥 거래 최소 단위입니다. 부동소수점 때문에 나온 게 아니라 거래의 편의성을 위해 호가 단위를 그렇게 정해놓은 거 뿐입니다.

  • @termterkim6031
    @termterkim6031 3 дня назад

    부동소수점은 항상 문제죠. 네트워크로 데이터를 전송할 때도 바이트 오더링을 신경 써야 하는데 이 때도 부동소수점은 문제가 복잡해집니다.