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/).
## [0.2.6] - 2024-01-08
- Fix URL in examples.
- minor edits
## [0.2.5] - 2023-11-06
- update readme.md
- fix CHANGELOG.md
- renamed IEEE754_VERSION to IEEE754_LIB_VERSION
- minor edits examples.
## [0.2.4] - 2022-11-12
- Add RP2040 support to build-CI.
- Add CHANGELOG.md

View File

@ -2,9 +2,9 @@
//
// FILE: IEEE754tools.h
// AUTHOR: Rob Tillaart
// VERSION: 0.2.5
// VERSION: 0.2.6
// PURPOSE: manipulate IEEE754 float numbers fast
// URL: https://github.com/RobTillaart/IEEE754tools.git
// URL: https://github.com/RobTillaart/IEEE754tools
//
// EXPERIMENTAL ==> USE WITH CARE
// not tested extensively,
@ -12,7 +12,7 @@
#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
@ -305,7 +305,6 @@ bool IEEE_FLOAT_NEQ(float &f, float &g)
////////////////////////////////////////////////////////////////////////////////
//
// NOT TESTED FUNCTIONS
@ -388,7 +387,7 @@ float IEEE_FLIP(float 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

View File

@ -1,6 +1,6 @@
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
of this software and associated documentation files (the "Software"), to deal

View File

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

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
// AUTHOR: Rob Tillaart
// PURPOSE: experimental
// URL: https://github.com/RobTillaart/IEEE754tools
//
// NOTE
// - WORKS ON AVR
// - FAILS FOR ESP32
// Notes
// - Works on AVR
// - Fails on ESP32
#include <IEEE754tools.h>
#include "IEEE754tools.h"
uint32_t start, duration;
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()
{
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 --

View File

@ -2,32 +2,28 @@
// FILE: float2double.ino
// AUTHOR: Rob Tillaart
// PURPOSE: experimental expands a float in a IEEE 754 double to be printed to PC.
// URL: https://github.com/RobTillaart/IEEE754tools
//
// NOTE
// - WORKS ON AVR
// - FAILS ON ESP32
// Notes
// - Works on AVR
// - Fails on ESP32
#include <IEEE754tools.h>
#include "IEEE754tools.h"
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(__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 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 --

View File

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

View File

@ -1,5 +1,5 @@
name=IEEE754tools
version=0.2.5
version=0.2.6
author=Rob Tillaart <rob.tillaart@gmail.com>
maintainer=Rob Tillaart <rob.tillaart@gmail.com>
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/Single-precision_floating-point_format
- https://github.com/RobTillaart/float16
- https://github.com/RobTillaart/printHelpers (to print scientific format float).
## WARNING
@ -57,6 +58,8 @@ ESP32 - needs investigation as UNO verified code fails.
#include "IEEE754tools.h"
```
See .h file for details.
## Operations

View File

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