Positron Compiler Documentation

32-bit and 64-bit FloatIng Point Maths

Positron16 · Revision 1.1.3.5 · PDF pages 32–35

The Positron16 compiler performs single precision (32-bit) IEEE754 FloatIng Point calculations and double precision (64-bit) IEEE754 FloatIng Point calculations.

Declaring a variable as Float or Double will enable 32-bit or 64-bit floating point calculations on that variable.

Dim MyFloat as Float
Dim MyDouble as Double

To create a floating point constant, add a decimal point. Especially if the value is a whole number.

Symbol PI = 3.14   ' Create an obvious floating point constant

Symbol FlNum = 5.0 ' Create a floating point value of a whole number

It is important to remember that floating point arithmetic is not the ultimate in accuracy, it is merely a means of compressing a complex or large value into a small space (4 bytes in the case of 32-bit Floats, and 8 bytes in the case of 64-bit Doubles), in essence, it is an approximation of a value. Perfectly adequate results can usually be obtained from correct scaling of integer variables, with an increase in speed and a saving of RAM and code space. 32-bit and 64-bit floating point math is quite microcontroller intensive since the microcontroller is only a 16-bit processor. It also consumes quite large amounts of RAM, and code space for its operation, therefore always use floating point sparingly, and only when strictly necessary.

Unlike Positron8 for 8-bit microcontrollers, which uses a modified floating point format, Positron16 uses the IEEE754 standard.

An IEEE754 single precision float variable has three components: a sign bit telling whether the number is positive or negative, an exponent giving its order of magnitude, and a mantissa specifying the actual digits of the number. Below is the bit layout:

For 32-bit Float:

 seeeeeeeemmmmmmmmmmmmmmmmmmmmmmm  meaning
31                              0  bit number

For 64-bit Double:

 seeeeeeeeeeeeeeeemmmmmmmmmmmmmmmmmmmmmmm....  meaning
63                                          0  bit number

s = sign bit, e = exponent, m = mantissa

View original PDF page 32Open page in PDFOriginal PDF page 32

32-bit FloatIng Point Example Programs.

' Multiply two floating point values
  Device = 24FJ64GA002             ' Select the device to compile for
  Declare Xtal = 16   ' Tell the compiler the device will be operating at 16MHz
  Declare Hserial_Baud = 9600       ' USART1 Baud rate
  Declare Hrsout1_Pin = PORTB.14    ' Select the pin for TX with USART1

  Dim MyFloat as Float
  Symbol cFlNum = 1.234             ' Create a floating point constant value

  RPOR7 = 3                         ' Make PPS Pin RP14 U1TX
  MyFloat = cFlNum * 10
  HrsoutLn Dec MyFloat

' Add two floating point variables
  Device = 24FJ64GA002             ' Select the device to compile for
  Declare Xtal = 16   ' Tell the compiler the device will be operating at 16MHz
  Declare Hserial_Baud = 9600       ' USART1 Baud rate
  Declare Hrsout1_Pin = PORTB.14    ' Select the pin for TX with USART1

  Dim MyFloat as Float
  Dim MyFloat1 as Float
  Dim MyFloat2 as Float

  RPOR7 = 3                         ' Make PPS Pin RP14 U1TX
  MyFloat1 = 1.23
  MyFloat2 = 1000.1
  MyFloat = MyFloat1 + MyFloat2
  HrsoutLn Dec MyFloat

' A digital volt meter, using the on-board 10-bit ADC
  Device = 24FJ64GA002             ' Select the device to compile for
  Declare Xtal = 16   ' Tell the compiler the device will be operating at 16MHz
  Declare Hserial_Baud = 9600       ' USART1 Baud rate
  Declare Hrsout1_Pin = PORTB.14    ' Select the pin for TX with USART1

  Declare Adin_Tad = cFRC        ' RC OSC chosen
  Declare Adin_Delay = 10        ' Allow 10us sample time

  Dim wRaw as Word
  Dim fVolts as Float
  Symbol cQuanta = 3.3 / 1024      ' Calculate the quantising value for 10-bits

  RPOR7 = 3                         ' Make PPS Pin RP14 U1TX
  AD1CON2 = 0                      ' +Vref = AVdd, -Vref = AVss
  AD1PCFGbits_PCFG0 = 0            ' Analogue input on AN0
  Do
     wRaw = ADin 0
     fVolts = wRaw * cQuanta
     HrsoutLn Dec2 fVolts, "V"
     DelayMs 300
  Loop
View original PDF page 33Open page in PDFOriginal PDF page 33

64-bit FloatIng Point Example Programs.

' Multiply two 64-bit floating point values
  Device = 24FJ64GA002             ' Select the device to compile for
  Declare Xtal = 16   ' Tell the compiler the device will be operating at 16MHz
  Declare Hserial_Baud = 9600     ' USART1 Baud rate
  Declare Hrsout1_Pin = PORTB.14  ' Select the pin for TX with USART1

  Dim MyDouble as Double
  Symbol cFlNum = 1.234             ' Create a floating point constant value

  RPOR7 = 3                         ' Make PPS Pin RP14 U1TX
  MyDouble = cFlNum * 10
  HrsoutLn Dec MyDouble

' Add two 64-bit floating point variables
  Device = 24FJ64GA002             ' Select the device to compile for
  Declare Xtal = 16   ' Tell the compiler the device will be operating at 16MHz
  Declare Hserial_Baud = 9600     ' USART1 Baud rate
  Declare Hrsout1_Pin = PORTB.14  ' Select the pin for TX with USART1

  Dim MyDouble as Double
  Dim MyDouble 1 as Double
  Dim MyDouble 2 as Double

  RPOR7 = 3                         ' Make PPS Pin RP14 U1TX
  MyDouble1 = 1.23
  MyDouble2 = 1000.1
  MyDouble = MyDouble1 + MyDouble2
  HrsoutLn Dec MyDouble

' A digital volt meter, using the on-board 10-bit ADC
  Device = 24FJ64GA002             ' Select the device to compile for
  Declare Xtal = 16   ' Tell the compiler the device will be operating at 16MHz
  Declare Hserial_Baud = 9600       ' USART1 Baud rate
  Declare Hrsout1_Pin = PORTB.14    ' Select the pin for TX with USART1

  Declare Adin_Tad = cFRC           ' RC OSC chosen
  Declare Adin_Delay = 10           ' Allow 10us sample time

  Dim wRaw as Word
  Dim fVolts as Double
  Symbol cQuanta = 3.3 / 1024      ' Calculate the quantising value for 10-bits

  RPOR7 = 3                         ' Make PPS Pin RP14 U1TX
  AD1CON2 = 0                      ' +Vref = AVdd, -Vref = AVss
  AD1PCFGbits_PCFG0 = 0            ' Analogue input on AN0
  Do
     wRaw = ADin 0
     fVolts = wRaw * cQuanta
     HrsoutLn Dec2 fVolts, "V"
     DelayMs 300
  Loop
View original PDF page 34Open page in PDFOriginal PDF page 34

Any expression that contains a floating point variable or constant will always be calculated as a floating point, even if the expression also contains integer constants or variables. The same applies for Doubles. If an expression has a mix of 32-bit floats and 64-bit doubles, the it will be carried out as 64-bit Double.

If the assignment variable is an integer variable, but the expression is of a floating point nature, then the floating point result will be converted into an integer.

  Device = 24FJ64GA002             ' Select the device to compile for
  Declare Xtal = 16   ' Tell the compiler the device will be operating at 16MHz
  Declare Hserial_Baud = 9600       ' USART1 Baud rate
  Declare Hrsout1_Pin = PORTB.14    ' Select the pin for TX with USART1

  Dim MyDword as Dword
  Dim MyFloat as Float
  Symbol cPI = 3.14

  RPOR7 = 3                         ' Make PPS Pin RP14 U1TX
  MyFloat = 10
'
' Float calculation with result 13.14, reduced to integer 13
'
  MyDword = MyFloat + cPI
  HrsoutLn Dec MyDword             ' Display the integer result 13
View original PDF page 35Open page in PDFOriginal PDF page 35

Topics