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

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

kumaGoro95
April 26, 2021
200

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

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ビット以上だと、切り捨てられる