avr-fw-modules/core/src/fp4816_to_a.c

42 lines
658 B
C
Executable File

#include <fixpoint/fp4816.h>
int fp4816_to_a(char *buffer,fp4816_t v) {
int8_t n = 14;
fp4816_t div = 0x5AF3107A4000LL << 16;
union {
fp4816_t value;
int32_t i32;
} u;
u.value = v;
if (u.value < 0) {
*(buffer++) = '-';
u.value = -u.value;
};
while (n >= 0) {
if (u.value >= div) {
uint8_t digit = u.value / div;
*(buffer++) = ('0' + digit);
u.value %= div;
} else if (n == 0) {
*(buffer++) = '0';
};
div /= 10;
n--;
};
*(buffer++) = ',';
while (n > -12) {
u.i32 *= 10;
uint8_t digit = u.i32 / (1L<<16);
u.i32 %= (1L<<16);
*(buffer++) = '0' + digit;
n--;
};
*(buffer) = 0x00;
return n;
};