initial version SCI notation

This commit is contained in:
RobTillaart 2018-02-01 14:46:25 +01:00
parent 6563bb4526
commit d630debbed
5 changed files with 473 additions and 0 deletions

View File

@ -0,0 +1,208 @@
//
// FILE: MathHelpers.h
// AUTHOR: Rob Tillaart
// DATE: 2018-01-21
//
//
// PUPROSE: misc functions for math and time
//
#ifndef MATHHELPERS
#define MATHHELPERS
#define MATHHELPERS_VERSION (F("0.1.0"))
// global buffer used by all functions
// so we do not need a static buffer in every function
// not usable in multi-threading environments
// results need to be printed/copied asap
char __mathHelperBuffer[16];
//////////////////////////////////////////////////
//
// FLOAT REPRESENTATION HELPERS
//
char * sci(double number, int digits)
{
int exponent = 0;
int pos = 0;
// Handling these costs 13 bytes RAM
// shorten them with N, I, -I ?
if (isnan(number))
{
strcpy(__mathHelperBuffer, "nan");
return __mathHelperBuffer;
}
if (isinf(number))
{
if (number < 0) strcpy(__mathHelperBuffer, "-inf");
strcpy(__mathHelperBuffer, "inf");
return __mathHelperBuffer;
}
// Handle negative numbers
bool neg = (number < 0.0);
if (neg)
{
__mathHelperBuffer[pos++] = '-';
number = -number;
}
while (number >= 10.0)
{
number /= 10;
exponent++;
}
while (number < 1 && number != 0.0)
{
number *= 10;
exponent--;
}
// Round correctly so that print(1.999, 2) prints as "2.00"
double rounding = 0.5;
for (uint8_t i = 0; i < digits; ++i)
{
rounding *= 0.1;
}
number += rounding;
if (number >= 10)
{
exponent++;
number /= 10;
}
// Extract the integer part of the number and print it
uint8_t d = (uint8_t)number;
double remainder = number - d;
__mathHelperBuffer[pos++] = d + '0'; // 1 digit before decimal point
if (digits > 0)
{
__mathHelperBuffer[pos++] = '.'; // decimal point TODO:rvdt CONFIG?
}
// Extract digits from the remainder one at a time to prevent missing leading zero's
while (digits-- > 0)
{
remainder *= 10.0;
d = (uint8_t)remainder;
__mathHelperBuffer[pos++] = d + '0';
remainder -= d;
}
// print exponent
__mathHelperBuffer[pos++] = 'E';
neg = exponent < 0;
if (neg)
{
__mathHelperBuffer[pos++] = '-';
exponent = -exponent;
}
else __mathHelperBuffer[pos++] = '+';
// 3 digits for exponent; // needed for double
// d = exponent / 100;
// __mathHelperBuffer[pos++] = d + '0';
// exponent -= d * 100;
// 2 digits for exponent
d = exponent / 10;
__mathHelperBuffer[pos++] = d + '0';
d = exponent - d*10;
__mathHelperBuffer[pos++] = d + '0';
__mathHelperBuffer[pos] = '\0';
return __mathHelperBuffer;
}
void sci(Stream &str, float f, uint8_t digits)
{
str.print(sci(f, digits));
}
//////////////////////////////////////////////////
//
// TIME HELPERS
//
// (true) 00:00:00 .. 23:59:59
// (false) 00:00 .. 23:59
char * seconds2clock(uint32_t seconds, bool displaySeconds=false)
{
uint16_t days = seconds / 86400UL; // strips the days
seconds -= (days * 86400UL);
uint8_t hours = seconds / 3600UL;
seconds -= (hours * 3600UL);
uint8_t minutes = seconds / 60UL;
seconds -= (minutes * 60UL);
uint8_t pos = 0;
__mathHelperBuffer[pos++] = hours/10 + '0';
__mathHelperBuffer[pos++] = hours%10 + '0';
__mathHelperBuffer[pos++] = ':';
__mathHelperBuffer[pos++] = minutes/10 + '0';
__mathHelperBuffer[pos++] = minutes%10 + '0';
if (displaySeconds)
{
__mathHelperBuffer[pos++] = ':';
__mathHelperBuffer[pos++] = seconds/10 + '0';
__mathHelperBuffer[pos++] = seconds%10 + '0';
}
__mathHelperBuffer[pos] = '\0';
return __mathHelperBuffer;
}
char * millis2clock(uint32_t millis)
{
uint32_t t = millis/1000;
seconds2clock(t, true);
uint16_t m = millis - t*1000;
__mathHelperBuffer[8] = '.';
uint8_t pos = 9;
uint8_t d = m/100;
__mathHelperBuffer[pos++] = d + '0';
m = m - d * 100;
d = m/10;
__mathHelperBuffer[pos++] = d + '0';
d = m - d * 10;
__mathHelperBuffer[pos++] = d + '0';
__mathHelperBuffer[pos] = '\0';
return __mathHelperBuffer;
}
float weeks(uint32_t seconds)
{
return seconds * 1.653439153439e-6; // /604800
}
float days(uint32_t seconds)
{
return seconds * 1.157407407407e-5; // /86400
}
float hours(uint32_t seconds)
{
return seconds * 2.777777777778e-4; // /3600
}
float minutes(uint32_t seconds)
{
return seconds * 1.666666666667e-2; // /60
}
#endif // MATHHELPERS
// END OF FILE

View File

@ -0,0 +1,208 @@
//
// FILE: mathHelperTest.ino
// AUTHOR: Rob Tillaart
// VERSION: 0.0.1
// PURPOSE:
//
// HISTORY:
#include "MathHelpers.h"
uint32_t start;
uint32_t stop;
void setup()
{
Serial.begin(115200);
Serial.println(__FILE__);
Serial.print("MATHHELPERS_VERSION: ");
Serial.println(MATHHELPERS_VERSION);
test1();
test2();
test3();
test4();
test5();
test10();
test11();
test12();
}
void loop()
{}
void test1()
{
Serial.println();
Serial.println(__FUNCTION__);
float f = 1;
for (int i = 0; i < 40; i++)
{
f *= 10;
Serial.println(sci(f, 6));
}
Serial.println();
f = 1;
for (int i = 0; i < 50; i++)
{
f /= 10;
Serial.println(sci(f, 6));
}
Serial.println();
f = -1;
for (int i = 0; i < 40; i++)
{
f *= 10;
Serial.println(sci(f, 6));
}
Serial.println();
f = -1;
for (int i = 0; i < 50; i++)
{
f /= 10;
Serial.println(sci(f, 6));
}
Serial.println();
Serial.println();
}
void test2()
{
Serial.println();
Serial.println(__FUNCTION__);
float f = 1;
for (int i = 0; i < 40; i++)
{
f *= (PI * PI);
Serial.println(sci(f, 6));
}
Serial.println();
f = 1;
for (int i = 0; i < 50; i++)
{
f /= (PI * PI);
Serial.println(sci(f, 6));
}
Serial.println();
f = -1;
for (int i = 0; i < 40; i++)
{
f *= (PI * PI);
Serial.println(sci(f, 6));
}
Serial.println();
f = -1;
for (int i = 0; i < 50; i++)
{
f /= (PI * PI);
Serial.println(sci(f, 6));
}
Serial.println();
Serial.println();
}
void test3()
{
Serial.println();
Serial.println(__FUNCTION__);
float f = PI;
for (int i = 0; i < 8; i++)
{
Serial.println(sci(f, i));
}
Serial.println();
}
void test4()
{
Serial.println();
Serial.println(__FUNCTION__);
float f = PI;
for (int i = 0; i < 8; i++)
{
sci(Serial, f, i);
Serial.println();
}
Serial.println();
}
void test5()
{
Serial.println();
Serial.println(__FUNCTION__);
float f = 1.0 / 0.0;
Serial.println(sci(f, 6));
f = 0.0 / 0.0;
Serial.println(sci(f, 6));
f = -1.0 / 0.0;
Serial.println(sci(f, 6));
// TODO find a -inf
Serial.println();
}
void test10()
{
Serial.println();
Serial.println(__FUNCTION__);
Serial.println("HH:MM:SS");
for (int i = 0; i < 7; i++)
{
uint32_t now = micros();
Serial.println(seconds2clock(now));
}
Serial.println();
}
void test11()
{
Serial.println();
Serial.println(__FUNCTION__);
Serial.println("HH:MM:SS.nnn");
for (int i = 0; i < 7; i++)
{
uint32_t now = micros();
Serial.println(millis2clock(now));
}
Serial.println();
}
void test12()
{
Serial.println();
Serial.println(__FUNCTION__);
Serial.println("time\tweeks\tdays\thours\tminutes");
for (int i = 0; i < 7; i++)
{
uint32_t now = micros();
Serial.print(now);
Serial.print('\t');
Serial.print(weeks(now), 3);
Serial.print('\t');
Serial.print(days(now), 3);
Serial.print('\t');
Serial.print(hours(now), 2);
Serial.print('\t');
Serial.println(minutes(now), 2);
}
Serial.println();
}
// END OF FILE

View File

@ -0,0 +1,24 @@
#######################################
# Syntax Coloring Map for Troolean
#######################################
#######################################
# Datatypes (KEYWORD1)
#######################################
#######################################
# Methods and Functions (KEYWORD2)
#######################################
sci KEYWORD2
seconds2clock KEYWORD2
millis2clock KEYWORD2
weeks KEYWORD2
days KEYWORD2
hours KEYWORD2
minutes KEYWORD2
#######################################
# Constants (LITERAL1)
#######################################

View File

@ -0,0 +1,24 @@
{
"name": "MathHelpers",
"keywords": "Math, scientific, exponential, notation, clock, weeks, days, hours, minutes",
"description": "Library with representation function for Arduino.",
"authors":
[
{
"name": "Rob Tillaart",
"email": "Rob.Tillaart@gmail.com",
"maintainer": true
}
],
"repository":
{
"type": "git",
"url": "https://github.com/RobTillaart/Arduino.git"
},
"version":"0.1.0",
"frameworks": "arduino",
"platforms": "*",
"export": {
"include": "libraries/MathHelpers"
}
}

View File

@ -0,0 +1,9 @@
name=MathHelpers
version=0.1.0
author=Rob Tillaart <rob.tillaart@gmail.com>
maintainer=Rob Tillaart <rob.tillaart@gmail.com>
sentence=Library with representation functions for Arduino.
paragraph=
category=Uncategorized
url=https://github.com/RobTillaart/Arduino/tree/master/libraries/
architectures=*