POV-Ray : Newsgroups : povray.general : Decimal floating point to Binary floating point conversion Server Time
20 Nov 2024 08:23:27 EST (-0500)
  Decimal floating point to Binary floating point conversion (Message 1 to 2 of 2)  
From: Tor Olav Kristensen
Subject: Decimal floating point to Binary floating point conversion
Date: 15 Oct 2001 19:55:54
Message: <3BCB7721.7461FFE4@hotmail.com>
- with POV-Ray scene description language.

See this thread "Re: binary help" (5. Oct. this group)
news://news.povray.org/3BCB3A33.1E311C94%40hotmail.com

I found this problem quite interesting,
so I just couldn't leave it alone.

Hopefully the tests at the end of my code
have scared out all the bugs   ;)

Note about the dec2bin() macro:
In my copy of v3.5.beta.4.msvc.win32,
values for the Ndigits parameter greater
than 31 generates wrong results.


Tor Olav


// ===== 1 ======= 2 ======= 3 ======= 4 ======= 5 ======= 6 ======= 7 =
// Copyright 2001 by Tor Olav Kristensen
// mailto:tor### [at] hotmailcom
// http://www.crosswinds.net/~tok
// ===== 1 ======= 2 ======= 3 ======= 4 ======= 5 ======= 6 ======= 7 =

#version 3.5;

// ===== 1 ======= 2 ======= 3 ======= 4 ======= 5 ======= 6 ======= 7 =

#declare log2 = function(N) { ln(N)/ln(2) }


#macro Sign(Num)

  #if (Num = 0)
    #local S = ""
  #else
    #if (Num > 0)
      #local S = "+"
    #else
      #local S = "-"
    #end // if
  #end // if

  S

#end // macro Sign


#macro d2b(Num, NrOfDigits)

  #local N = Num;
  #local S = ""
  #local Cnt = 0;
  #while (Cnt < NrOfDigits)
    #if (mod(N, 2) = 0)
      #local S = concat("0", S)
    #else
      #local S = concat("1", S)
    #end // if
    #local N = div(N, 2);
    #local Cnt = Cnt + 1;
  #end // while

  S

#end // macro d2b


#macro dec2bin(N, Ndigits)

  #local Nabs = abs(N);
  #if (N = 0)
    #local E = 0;
    #local Exponent = "0"
  #else
    #local E = floor(log2(Nabs));
    #local Eabs = abs(E);
    #if (E = 0)
      #local Edigits = 1;
    #else
      #local Edigits = 1 + floor(log2(Eabs));
    #end // if
    #local Exponent = d2b(Eabs, Edigits)
  #end // if
  #local Mabs = int(Nabs*2^(Ndigits - E - 1));
  #local Mantissa = d2b(Mabs, Ndigits)
  #if (Ndigits >= 2)
    #local Mantissa = concat(
                        substr(Mantissa, 1, 1),
                        ".",
                        substr(Mantissa, 2, Ndigits - 1)
                      )
  #end // if

  concat(Sign(N), Mantissa, "E", Sign(E), Exponent)

#end // macro dec2bin

// ===== 1 ======= 2 ======= 3 ======= 4 ======= 5 ======= 6 ======= 7 =

#macro Test(NN, Digits)

  #debug "\n"
  #debug str(NN, 0, -1)
  #debug " = "
  #debug dec2bin(NN, Digits)

#end // macro Test


Test(0, 8)            // 0.0000000E0
Test(0.000471, 16)    // +1.111011011110000E-1100
Test(-33.333333, 16)  // -1.000010101010101E+101
Test(1024.5, 14)      // +1.0000000000100E+1010
Test(2^-16, 6)        // +1.00000E-10000
Test(2^128, 12)       // +1.00000000000E+10000000
Test(1, 4)            // +1.000E0
Test(-2, 4)           // -1.000E+1
Test(0.7, 16)         // +1.011001100110011E-1
Test(-34.578E-10, 31) // -1.110110110011110010000101100101E-11101

#debug "\n\n"

// ===== 1 ======= 2 ======= 3 ======= 4 ======= 5 ======= 6 ======= 7 =


Post a reply to this message

From: Tom Melly
Subject: Re: Decimal floating point to Binary floating point conversion
Date: 16 Oct 2001 05:49:10
Message: <3bcc0296$1@news.povray.org>
"Tor Olav Kristensen" <tor### [at] hotmailcom> wrote in message
news:3BCB7721.7461FFE4@hotmail.com...
>
> I found this problem quite interesting,
> so I just couldn't leave it alone.
>

I can see - fantastic, just what I need. I will update my faq asap. Many thanks!


Post a reply to this message

Copyright 2003-2023 Persistence of Vision Raytracer Pty. Ltd.