Upgrade to Pro — share decks privately, control downloads, hide ads and more …

プログラミングで小数計算すると なんで誤差が発生するのか?

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for kumaGoro95 kumaGoro95
April 26, 2021
260

プログラミングで小数計算すると なんで誤差が発生するのか?

Avatar for kumaGoro95

kumaGoro95

April 26, 2021
Tweet

More Decks by kumaGoro95

Transcript

  1. • 「0」と「1」という2個の数字を使って数を表す
 • その桁の数値が「2」になると桁上がりする
 2進数って?
 10進数
 2進数
 1
 1
 2


    10
 3
 11
 4
 100
 4桁目
 3桁目
 2桁目
 1桁目
 8
 4
 2
 1
 例:2進数の「1111」を
      10進数に直すと...
 → 8+4+2+1 = 15 になる

  2. 2進数での小数の表し方
 1
 1
 1
 .
 1
 1
 1
 1
 100


    10
 1
 
 1/10
 1/100
 1/1000
 1/10000
 〇「111.1111」という数字があるとする
 これが10進数表記だったら・・・
 <各桁の重み>

  3. 2進数での小数の表し方
 1
 1
 1
 .
 1
 1
 1
 1
 4


    2
 1
 
 1/2
 1/4
 1/8
 1/16
 〇「111.1111」という数字があるとする
 では、2進数だったら?
 2進数の「111.1111」を10進数に直すと
 → (4+2+1) + (0.5 + 0.25 + 0.125 + 0.0625) = 7.9375 
 2の倍数の分母を持つ分数でないと表せない 

  4. ケース1:循環小数 
 double num1 = 1.2; double num2 = 1.0;

    System.out.println(num1 - num2); //0.19999999999999996 
 → 「0.2」は2進数で表せない  (2進数だと「0.001100110011...」循環小数に)
  5. double num1 = 0.1234; double num2 = 0.000000000000000004321; System.out.println(num1 +

    num2); //0.1234 ケース2:情報落ち 
 → double/float型は浮動小数点数(桁数が有限)なので、
  正規化が行われる(切り捨てられる)

  6. 浮動小数点数とは
 
 
 
 
 
 
 
 
 


    
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 - - 3
 - 0.1 × 2
 符号
 仮数
 指数
 符号 (1Bit)
 指数 (11Bit)
 仮数 (52Bit)
 〇 double型(64ビット)の場合
 → 仮数が52ビット以上だと、切り捨てられる