Дроби в двоичном виде

Тема в разделе "WASM.A&O", создана пользователем Mikl___, 24 ноя 2019.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.707

    Преамбула

    Потребовалось перевести 1/6 в IEEE 754 single precision. Обычно, перевод перекладываю на плечи компилятора, но, на этот раз, пришлось переводить вручную с использованием Windows-калькулятора из стандартного набора программ
    1. 1/6=0,16666666666666666666666666666667
    2. 0,16666666666666666666666666666667 > 0 поэтому знак=0
    3. вычисляю степень:
      log2(0,16666666666666666666666666666667) = lg(0,16666666666666666666666666666667)/lg(2) = -2,584962501
      округляю -2,584962501 в меньшую сторону -3
      степень в смещенном виде 127-3 = 124 = 1111100
      подгоняю под 8 разрядов 01111100
    4. вычисляю мантиссу:
      23 разряда -(-3) (степень)=26
      (0,16666666666666666666666666666667-2-3)× 226 = 0,04166666666666666666666666666667 × 67108864 = 2796202,6666666666666666666666669 ≈ 2796203 = 1010101010101010101011
      подгоняю под 23 разряда 01010101010101010101011
    5. собираю число:
      знак.степень.мантисса = 0.01111100.01010101010101010101011 = 0011.1110.0010.1010.1010.1010.1010.1011 = 0x3E2AAAAB
    И вот тут я обратил внимание на группы повторяющихся 0 и 1.

    Основная часть

    Двоичное представление дробей вида [math]\frac{M}{2^{N}-1}[/math] без вычислений на калькуляторе, возможно, кому-то пригодится :)
    1/3 = 0,33333333333333333333333333333333 = 0,01.01.01.01.01.01.01.01.01.01.01
    2/3 = 0,66666666666666666666666666666667 = 0,10.10.10.10.10.10.10.10.10.10.10
    1/6 = 0,16666666666666666666666666666667 = 0,0.01.01.01.01.01.01.01.01.01.01.01 = (1/3)/2
    1/7 = 0,14285714285714285714285714285714 = 0,001.001.001.001.001.001.001.001
    2/7 = 0,28571428571428571428571428571429 = 0,010.010.010.010.010.010.010.010
    3/7 = 0.42857142857142857142857142857143 = 0,011.011.011.011.011.011.011.011
    4/7 = 0,57142857142857142857142857142857 = 0,100.100.100.100.100.100.100.100
    5/7 = 0,71428571428571428571428571428571 = 0,101.101.101.101.101.101.101.101
    6/7 = 0,85714285714285714285714285714286 = 0,110.110.110.110.110.110.110.110
    1/15 = 0,06666666666666666666666666666667 = 0,0001.0001.0001.0001.0001.0001.0001
    2/15 = 0,13333333333333333333333333333333 = 0,0010.0010.0010.0010.0010.0010.0010
    1/5 = 0,2 = 0,0011.0011.0011.0011.0011.0011.0011 = 3/15
    4/15 = 0,26666666666666666666666666666667 = 0,0100.0100.0100.0100.0100.0100.0100
    7/31 = 0,22580645161290322580645161290323 = 0,00111.00111.00111.00111.00111.00111
     
    TermoSINteZ, RamMerLabs и q2e74 нравится это.