0.2.6 IEEE754tools

This commit is contained in:
Rob Tillaart 2024-01-08 18:12:12 +01:00
parent 591bac1953
commit 74df5f6571
11 changed files with 171 additions and 92 deletions

View File

@ -6,13 +6,17 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/). and this project adheres to [Semantic Versioning](http://semver.org/).
## [0.2.6] - 2024-01-08
- Fix URL in examples.
- minor edits
## [0.2.5] - 2023-11-06 ## [0.2.5] - 2023-11-06
- update readme.md - update readme.md
- fix CHANGELOG.md - fix CHANGELOG.md
- renamed IEEE754_VERSION to IEEE754_LIB_VERSION - renamed IEEE754_VERSION to IEEE754_LIB_VERSION
- minor edits examples. - minor edits examples.
## [0.2.4] - 2022-11-12 ## [0.2.4] - 2022-11-12
- Add RP2040 support to build-CI. - Add RP2040 support to build-CI.
- Add CHANGELOG.md - Add CHANGELOG.md

View File

@ -2,9 +2,9 @@
// //
// FILE: IEEE754tools.h // FILE: IEEE754tools.h
// AUTHOR: Rob Tillaart // AUTHOR: Rob Tillaart
// VERSION: 0.2.5 // VERSION: 0.2.6
// PURPOSE: manipulate IEEE754 float numbers fast // PURPOSE: manipulate IEEE754 float numbers fast
// URL: https://github.com/RobTillaart/IEEE754tools.git // URL: https://github.com/RobTillaart/IEEE754tools
// //
// EXPERIMENTAL ==> USE WITH CARE // EXPERIMENTAL ==> USE WITH CARE
// not tested extensively, // not tested extensively,
@ -12,7 +12,7 @@
#include "Arduino.h" #include "Arduino.h"
#define IEEE754_LIB_VERSION (F("0.2.5")) #define IEEE754_LIB_VERSION (F("0.2.6"))
// (un)comment lines to configure functionality / size // (un)comment lines to configure functionality / size
@ -305,7 +305,6 @@ bool IEEE_FLOAT_NEQ(float &f, float &g)
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// //
// NOT TESTED FUNCTIONS // NOT TESTED FUNCTIONS
@ -388,7 +387,7 @@ float IEEE_FLIP(float number)
// s = *(((uint8_t*) &number)+3) & 0x80; // s = sign(number); // s = *(((uint8_t*) &number)+3) & 0x80; // s = sign(number);
// if ( *(((byte*) &number)+3) & 0x80) x=2; // if (number < 0) x=2; // if ( *(((byte*) &number)+3) & 0x80) x = 2; // if (number < 0) x = 2;
// GAIN = factor 5 // GAIN = factor 5

View File

@ -1,6 +1,6 @@
MIT License MIT License
Copyright (c) 2013-2023 Rob Tillaart Copyright (c) 2013-2024 Rob Tillaart
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View File

@ -1,48 +1,37 @@
// //
// FILE: FastNegate.ino // FILE: FastNegate.ino
// AUTHOR: Rob dot Tillaart at gmail dot com // AUTHOR: Rob Tillaart
// PURPOSE: Fast negate for floating points // PURPOSE: Fast negate for floating points
// URL: https://github.com/RobTillaart/IEEE754tools
#include "IEEE754tools.h" #include "IEEE754tools.h"
volatile float zz = 100; volatile float zz = 100;
volatile int x = 3; volatile int x = 3;
uint32_t start, duration1, duration2; uint32_t start, duration1, duration2;
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println(__FILE__);
Serial.print("IEEE754_LIB_VERSION: ");
Serial.println(IEEE754_LIB_VERSION);
Serial.println();
test_negfabs();
test_fabs();
test_negate();
test_less_zero();
test5();
}
void test_negfabs() void test_negfabs()
{ {
Serial.println(__FUNCTION__); Serial.println(__FUNCTION__);
Serial.println("TEST : zz = -fabs(zz)"); Serial.println("TEST : zz = -fabs(zz)");
delay(100);
start = micros(); start = micros();
for (int i = 0; i < 30000; i++) for (int i = 0; i < 30000; i++)
{ {
*(((byte*) &zz) + 3) |= 0x80; // Force negative == -fabs(zz); *(((byte*) &zz) + 3) |= 0x80; // Force negative == -fabs(zz);
} }
duration1 = micros() - start; duration1 = micros() - start;
Serial.print("TIME : "); Serial.print("TIME : ");
Serial.println(duration1 / 30000.0, 4); Serial.println(duration1 / 30000.0, 4);
Serial.print("VALUE: "); Serial.print("VALUE: ");
Serial.println(zz); Serial.println(zz);
delay(10); delay(100);
zz = 100; zz = 100;
start = micros(); start = micros();
@ -51,6 +40,7 @@ void test_negfabs()
zz = -fabs(zz); zz = -fabs(zz);
} }
duration2 = micros() - start; duration2 = micros() - start;
Serial.print("TIME : "); Serial.print("TIME : ");
Serial.println(duration2 / 30000.0, 4); Serial.println(duration2 / 30000.0, 4);
Serial.print("VALUE: "); Serial.print("VALUE: ");
@ -58,7 +48,7 @@ void test_negfabs()
Serial.print("GAIN : "); Serial.print("GAIN : ");
Serial.println(1.0 * duration2 / duration1, 2); Serial.println(1.0 * duration2 / duration1, 2);
Serial.println(); Serial.println();
delay(10); delay(100);
} }
@ -66,17 +56,20 @@ void test_fabs()
{ {
Serial.println(__FUNCTION__); Serial.println(__FUNCTION__);
Serial.println("TEST : zz = fabs(zz)"); Serial.println("TEST : zz = fabs(zz)");
delay(100);
start = micros(); start = micros();
for (int i = 0; i < 30000; i++) for (int i = 0; i < 30000; i++)
{ {
*(((byte*) &zz) + 3) &= 0x7F; // force positive == fabs(zz); *(((byte*) &zz) + 3) &= 0x7F; // force positive == fabs(zz);
} }
duration1 = micros() - start; duration1 = micros() - start;
Serial.print("TIME : "); Serial.print("TIME : ");
Serial.println(duration1 / 30000.0, 4); Serial.println(duration1 / 30000.0, 4);
Serial.print("VALUE: "); Serial.print("VALUE: ");
Serial.println(zz); Serial.println(zz);
delay(10); delay(100);
start = micros(); start = micros();
for (int i = 0; i < 30000; i++) for (int i = 0; i < 30000; i++)
@ -84,6 +77,7 @@ void test_fabs()
zz = fabs(zz); zz = fabs(zz);
} }
duration2 = micros() - start; duration2 = micros() - start;
Serial.print("TIME : "); Serial.print("TIME : ");
Serial.println(duration2 / 30000.0, 4); Serial.println(duration2 / 30000.0, 4);
Serial.print("VALUE: "); Serial.print("VALUE: ");
@ -91,7 +85,7 @@ void test_fabs()
Serial.print("GAIN : "); Serial.print("GAIN : ");
Serial.println(1.0 * duration2 / duration1, 2); Serial.println(1.0 * duration2 / duration1, 2);
Serial.println(); Serial.println();
delay(10); delay(100);
} }
@ -99,16 +93,20 @@ void test_negate()
{ {
Serial.println(__FUNCTION__); Serial.println(__FUNCTION__);
Serial.println("TEST : zz = -zz"); Serial.println("TEST : zz = -zz");
delay(100);
start = micros(); start = micros();
for (int i = 0; i < 30000; i++) for (int i = 0; i < 30000; i++)
{ {
*(((byte*) &zz) + 3) ^= 0x80; *(((byte*) &zz) + 3) ^= 0x80;
} }
duration1 = micros() - start; duration1 = micros() - start;
Serial.print("TIME : "); Serial.print("TIME : ");
Serial.println(duration1 / 30000.0, 4); Serial.println(duration1 / 30000.0, 4);
Serial.print("VALUE: "); Serial.print("VALUE: ");
Serial.println(zz); Serial.println(zz);
delay(100);
start = micros(); start = micros();
for (int i = 0; i < 30000; i++) for (int i = 0; i < 30000; i++)
@ -116,6 +114,7 @@ void test_negate()
zz = -zz; zz = -zz;
} }
duration2 = micros() - start; duration2 = micros() - start;
Serial.print("TIME : "); Serial.print("TIME : ");
Serial.println(duration2 / 30000.0, 4); Serial.println(duration2 / 30000.0, 4);
Serial.print("VALUE: "); Serial.print("VALUE: ");
@ -123,7 +122,7 @@ void test_negate()
Serial.print("GAIN : "); Serial.print("GAIN : ");
Serial.println(1.0 * duration2 / duration1, 2); Serial.println(1.0 * duration2 / duration1, 2);
Serial.println(); Serial.println();
delay(10); delay(100);
} }
@ -131,16 +130,20 @@ void test_less_zero()
{ {
Serial.println(__FUNCTION__); Serial.println(__FUNCTION__);
Serial.println("TEST : if (zz < 0) "); Serial.println("TEST : if (zz < 0) ");
delay(100);
start = micros(); start = micros();
for (int i = 0; i < 30000; i++) for (int i = 0; i < 30000; i++)
{ {
if ( *(((byte*) &zz) + 3) & 0x80) x = 2; // equals if (zz < 0); if ( *(((byte*) &zz) + 3) & 0x80) x = 2; // equals if (zz < 0);
} }
duration1 = micros() - start; duration1 = micros() - start;
Serial.print("TIME : "); Serial.print("TIME : ");
Serial.println(duration1 / 30000.0, 4); Serial.println(duration1 / 30000.0, 4);
Serial.print("VALUE: "); Serial.print("VALUE: ");
Serial.println(zz); Serial.println(zz);
delay(100);
start = micros(); start = micros();
for (int i = 0; i < 30000; i++) for (int i = 0; i < 30000; i++)
@ -148,6 +151,7 @@ void test_less_zero()
if (zz < 0) x = 2; if (zz < 0) x = 2;
} }
duration2 = micros() - start; duration2 = micros() - start;
Serial.print("TIME : "); Serial.print("TIME : ");
Serial.println(duration2 / 30000.0, 4); Serial.println(duration2 / 30000.0, 4);
Serial.print("VALUE: "); Serial.print("VALUE: ");
@ -160,10 +164,12 @@ void test_less_zero()
{ {
x = 2; x = 2;
} }
uint32_t duration3 = micros() - start;
Serial.print("TIME : "); Serial.print("TIME : ");
Serial.println((micros() - start) / 30000.0, 4); Serial.println(duration3 / 30000.0, 4);
Serial.println(); Serial.println();
delay(10); delay(100);
} }
@ -183,6 +189,25 @@ void test5()
zz = 100; zz = 100;
if (*(((byte*) &zz) + 3) & 0x80) Serial.println("N"); if (*(((byte*) &zz) + 3) & 0x80) Serial.println("N");
else Serial.println("P"); else Serial.println("P");
delay(100);
}
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println(__FILE__);
Serial.print("IEEE754_LIB_VERSION: ");
Serial.println(IEEE754_LIB_VERSION);
Serial.println();
delay(100);
test_negfabs();
test_fabs();
test_negate();
test_less_zero();
test5();
} }
@ -192,4 +217,3 @@ void loop()
// -- END OF FILE -- // -- END OF FILE --

View File

@ -0,0 +1,45 @@
IDE: 1.8.19
Board: UNO
IEEE754tools\examples\FastNegate\FastNegate.ino
IEEE754_LIB_VERSION: 0.2.6
test_negfabs
TEST : zz = -fabs(zz)
TIME : 0.3144
VALUE: -100.00
TIME : 1.3835
VALUE: -100.00
GAIN : 4.40
test_fabs
TEST : zz = fabs(zz)
TIME : 0.3144
VALUE: 100.00
TIME : 1.3205
VALUE: 100.00
GAIN : 4.20
test_negate
TEST : zz = -zz
TIME : 0.3144
VALUE: 100.00
TIME : 1.3205
VALUE: 100.00
GAIN : 4.20
test_less_zero
TEST : if (zz < 0)
TIME : 0.4403
VALUE: 100.00
TIME : 4.0868
VALUE: 100.00
GAIN : 9.28
TIME : 0.5087
test5
N
P
N
P

View File

@ -2,41 +2,20 @@
// FILE: IEEE754_equal.ino // FILE: IEEE754_equal.ino
// AUTHOR: Rob Tillaart // AUTHOR: Rob Tillaart
// PURPOSE: experimental // PURPOSE: experimental
// URL: https://github.com/RobTillaart/IEEE754tools
// //
// NOTE // Notes
// - WORKS ON AVR // - Works on AVR
// - FAILS FOR ESP32 // - Fails on ESP32
#include <IEEE754tools.h> #include "IEEE754tools.h"
uint32_t start, duration; uint32_t start, duration;
volatile bool b; volatile bool b;
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println(__FILE__);
Serial.print("IEEE754_LIB_VERSION: ");
Serial.println(IEEE754_LIB_VERSION);
Serial.println();
test_FLOAT_EQ_1();
test_FLOAT_EQ_2();
test_DIV2();
test_POW2();
Serial.println("done");
}
void loop()
{
}
void test_FLOAT_EQ_1() void test_FLOAT_EQ_1()
{ {
Serial.println(); Serial.println();
@ -190,5 +169,28 @@ void test_POW2()
} }
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println(__FILE__);
Serial.print("IEEE754_LIB_VERSION: ");
Serial.println(IEEE754_LIB_VERSION);
Serial.println();
test_FLOAT_EQ_1();
test_FLOAT_EQ_2();
test_DIV2();
test_POW2();
Serial.println("done");
}
void loop()
{
}
// -- END OF FILE -- // -- END OF FILE --

View File

@ -2,32 +2,28 @@
// FILE: float2double.ino // FILE: float2double.ino
// AUTHOR: Rob Tillaart // AUTHOR: Rob Tillaart
// PURPOSE: experimental expands a float in a IEEE 754 double to be printed to PC. // PURPOSE: experimental expands a float in a IEEE 754 double to be printed to PC.
// URL: https://github.com/RobTillaart/IEEE754tools
// //
// NOTE // Notes
// - WORKS ON AVR // - Works on AVR
// - FAILS ON ESP32 // - Fails on ESP32
#include <IEEE754tools.h> #include "IEEE754tools.h"
byte x[8]; byte x[8];
void setup() void dumpByteArray(byte *ar)
{ {
Serial.begin(115200); for (int i = 0; i < 8; i++)
{
if (ar[i] < 0x10) Serial.print('0');
Serial.print(ar[i], HEX);
Serial.print(' ');
}
Serial.println(); Serial.println();
Serial.println(__FILE__);
Serial.print("IEEE754_LIB_VERSION: ");
Serial.println(IEEE754_LIB_VERSION);
Serial.println();
test1();
test2();
test3();
test4();
Serial.println("done");
} }
@ -90,22 +86,28 @@ void test4()
} }
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println(__FILE__);
Serial.print("IEEE754_LIB_VERSION: ");
Serial.println(IEEE754_LIB_VERSION);
Serial.println();
test1();
test2();
test3();
test4();
Serial.println("done");
}
void loop() void loop()
{ {
} }
void dumpByteArray(byte *ar)
{
for (int i = 0; i < 8; i++)
{
if (ar[i] < 0x10) Serial.print('0');
Serial.print(ar[i], HEX);
Serial.print(' ');
}
Serial.println();
}
// -- END OF FILE -- // -- END OF FILE --

View File

@ -15,7 +15,7 @@
"type": "git", "type": "git",
"url": "https://github.com/RobTillaart/IEEE754tools.git" "url": "https://github.com/RobTillaart/IEEE754tools.git"
}, },
"version": "0.2.5", "version": "0.2.6",
"license": "MIT", "license": "MIT",
"frameworks": "*", "frameworks": "*",
"platforms": "*", "platforms": "*",

View File

@ -1,5 +1,5 @@
name=IEEE754tools name=IEEE754tools
version=0.2.5 version=0.2.6
author=Rob Tillaart <rob.tillaart@gmail.com> author=Rob Tillaart <rob.tillaart@gmail.com>
maintainer=Rob Tillaart <rob.tillaart@gmail.com> maintainer=Rob Tillaart <rob.tillaart@gmail.com>
sentence=Fast helper functions for IEEE754 floats. sentence=Fast helper functions for IEEE754 floats.

View File

@ -26,6 +26,7 @@ These bit-hacks started in 2010 (oldest code found), maybe even earlier.
- http://en.wikipedia.org/wiki/Double_precision - http://en.wikipedia.org/wiki/Double_precision
- http://en.wikipedia.org/wiki/Single-precision_floating-point_format - http://en.wikipedia.org/wiki/Single-precision_floating-point_format
- https://github.com/RobTillaart/float16 - https://github.com/RobTillaart/float16
- https://github.com/RobTillaart/printHelpers (to print scientific format float).
## WARNING ## WARNING
@ -57,6 +58,8 @@ ESP32 - needs investigation as UNO verified code fails.
#include "IEEE754tools.h" #include "IEEE754tools.h"
``` ```
See .h file for details.
## Operations ## Operations

View File

@ -71,7 +71,7 @@ unittest(test_all)
fprintf(stderr, "IEEE_NegINF\n"); fprintf(stderr, "IEEE_NegINF\n");
assertTrue(IEEE_NegINF(-exp(800))); assertTrue(IEEE_NegINF(-exp(800)));
// crash - AVR specific // crash - AVR specific
// fprintf(stderr, "IEEE_Sign\n"); // fprintf(stderr, "IEEE_Sign\n");
// assertTrue(IEEE_Sign(PI)); // assertTrue(IEEE_Sign(PI));
// assertTrue(IEEE_Sign(-PI)); // assertTrue(IEEE_Sign(-PI));