#include <stdio.h>
const char digits[] = "0123456789abcdef";
union Float64 {
double y;
char bytes[8];
};
struct Tdat {
char *txt;
double y;
};
static void test(struct Tdat *tst, char *end) {
union Float64 q;
char a, b;
q.y = tst->y; // set the double value for the test
for (int i = 7; i >= 0; i--) {
a = digits[q.bytes[i] & 0x0f]; // lower nibble
b = digits[(q.bytes[i] & 0xf0) >> 4]; // upper nibble
}
printf("%s%c", tst
->txt
, end
);
return;
}
int main(void) {
// tests only, pure and simple
test(&(struct Tdat){ .y = +1.0, .txt = "(+1.0)" }, '\n');
test(&(struct Tdat){ .y = -1.0, .txt = "(-1.0)" }, '\n');
test(&(struct Tdat){ .y = -0.0, .txt = "(-0.0)" }, '\n');
printf("Consecutive and ascending Numbers:\n"); test(&(struct Tdat){ .y = +2.0, .txt = "(+2.0)" }, '\n');
test(&(struct Tdat){ .y = +3.0, .txt = "(+3.0)" }, '\n');
test(&(struct Tdat){ .y = +4.0, .txt = "(+4.0)" }, '\n');
test(&(struct Tdat){ .y = +8.0, .txt = "(+8.0)" }, '\n');
test(&(struct Tdat){ .y = +16.0, .txt = "(+16.0)" }, '\n');
printf("Numbers with fractions:\n"); test(&(struct Tdat){ .y = +1.1, .txt = "(+1.1)" }, '\n');
test(&(struct Tdat){ .y = +3.14159, .txt = "(+3.14159)" }, '\n');
printf("Fractions ending in 5\n"); test(&(struct Tdat){ .y = +1.5, .txt = "(+1.5)" }, '\n');
test(&(struct Tdat){ .y = +1.25, .txt = "(+1.25)" }, '\n');
test(&(struct Tdat){ .y = +1.125, .txt = "(+1.125)" }, '\n');
test(&(struct Tdat){ .y = +1.0625, .txt = "(+1.0625)" }, '\n');
test(&(struct Tdat){ .y = +1.03125, .txt = "(+1.03125)" }, '\n');
test(&(struct Tdat){ .y = +1.0 / +0.0, .txt = "(Inf)" }, '\n');
test(&(struct Tdat){ .y = +0.0 / +0.0, .txt = "(NaN)" }, '\0');
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CmNvbnN0IGNoYXIgZGlnaXRzW10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7Cgp1bmlvbiBGbG9hdDY0IHsKCWRvdWJsZSB5OwoJY2hhciBieXRlc1s4XTsKfTsKCnN0cnVjdCBUZGF0IHsKCWNoYXIgKnR4dDsKCWRvdWJsZSB5Owp9OwoKc3RhdGljIHZvaWQgdGVzdChzdHJ1Y3QgVGRhdCAqdHN0LCBjaGFyICplbmQpIHsKCXVuaW9uIEZsb2F0NjQgcTsKCWNoYXIgYSwgYjsKCglxLnkgPSB0c3QtPnk7ICAvLyBzZXQgdGhlIGRvdWJsZSB2YWx1ZSBmb3IgdGhlIHRlc3QKCglmb3IgKGludCBpID0gNzsgaSA+PSAwOyBpLS0pIHsKCQlhID0gZGlnaXRzW3EuYnl0ZXNbaV0gJiAweDBmXTsgICAgICAgICAvLyBsb3dlciBuaWJibGUKCQliID0gZGlnaXRzWyhxLmJ5dGVzW2ldICYgMHhmMCkgPj4gNF07ICAvLyB1cHBlciBuaWJibGUKCQlwcmludGYoIiVjJWMgIiwgYiwgYSk7Cgl9CglwcmludGYoIiVzJWMiLCB0c3QtPnR4dCwgZW5kKTsKCglyZXR1cm47Cn0KCmludCBtYWluKHZvaWQpIHsKCS8vIHRlc3RzIG9ubHksIHB1cmUgYW5kIHNpbXBsZQoKCXByaW50ZigiSW5pdGlhbCBjYXNlczpcbiIpOwoJdGVzdCgmKHN0cnVjdCBUZGF0KXsgLnkgPSArMS4wLCAudHh0ID0gIigrMS4wKSIgfSwgJ1xuJyk7Cgl0ZXN0KCYoc3RydWN0IFRkYXQpeyAueSA9IC0xLjAsIC50eHQgPSAiKC0xLjApIiB9LCAnXG4nKTsKCXRlc3QoJihzdHJ1Y3QgVGRhdCl7IC55ID0gLTAuMCwgLnR4dCA9ICIoLTAuMCkiIH0sICdcbicpOwoKCXByaW50ZigiQ29uc2VjdXRpdmUgYW5kIGFzY2VuZGluZyBOdW1iZXJzOlxuIik7Cgl0ZXN0KCYoc3RydWN0IFRkYXQpeyAueSA9ICsyLjAsIC50eHQgPSAiKCsyLjApIiB9LCAnXG4nKTsKCXRlc3QoJihzdHJ1Y3QgVGRhdCl7IC55ID0gKzMuMCwgLnR4dCA9ICIoKzMuMCkiIH0sICdcbicpOwoJdGVzdCgmKHN0cnVjdCBUZGF0KXsgLnkgPSArNC4wLCAudHh0ID0gIigrNC4wKSIgfSwgJ1xuJyk7Cgl0ZXN0KCYoc3RydWN0IFRkYXQpeyAueSA9ICs4LjAsIC50eHQgPSAiKCs4LjApIiB9LCAnXG4nKTsKCXRlc3QoJihzdHJ1Y3QgVGRhdCl7IC55ID0gKzE2LjAsIC50eHQgPSAiKCsxNi4wKSIgfSwgJ1xuJyk7CgoJcHJpbnRmKCJOdW1iZXJzIHdpdGggZnJhY3Rpb25zOlxuIik7Cgl0ZXN0KCYoc3RydWN0IFRkYXQpeyAueSA9ICsxLjEsIC50eHQgPSAiKCsxLjEpIiB9LCAnXG4nKTsKCXRlc3QoJihzdHJ1Y3QgVGRhdCl7IC55ID0gKzMuMTQxNTksIC50eHQgPSAiKCszLjE0MTU5KSIgfSwgJ1xuJyk7CgoJcHJpbnRmKCJGcmFjdGlvbnMgZW5kaW5nIGluIDVcbiIpOwoJdGVzdCgmKHN0cnVjdCBUZGF0KXsgLnkgPSArMS41LCAudHh0ID0gIigrMS41KSIgfSwgJ1xuJyk7Cgl0ZXN0KCYoc3RydWN0IFRkYXQpeyAueSA9ICsxLjI1LCAudHh0ID0gIigrMS4yNSkiIH0sICdcbicpOwoJdGVzdCgmKHN0cnVjdCBUZGF0KXsgLnkgPSArMS4xMjUsIC50eHQgPSAiKCsxLjEyNSkiIH0sICdcbicpOwoJdGVzdCgmKHN0cnVjdCBUZGF0KXsgLnkgPSArMS4wNjI1LCAudHh0ID0gIigrMS4wNjI1KSIgfSwgJ1xuJyk7Cgl0ZXN0KCYoc3RydWN0IFRkYXQpeyAueSA9ICsxLjAzMTI1LCAudHh0ID0gIigrMS4wMzEyNSkiIH0sICdcbicpOwoKCXByaW50ZigiU3BlY2lhbCBjYXNlczpcbiIpOwoJdGVzdCgmKHN0cnVjdCBUZGF0KXsgLnkgPSArMS4wIC8gKzAuMCwgLnR4dCA9ICIoSW5mKSIgfSwgJ1xuJyk7Cgl0ZXN0KCYoc3RydWN0IFRkYXQpeyAueSA9ICswLjAgLyArMC4wLCAudHh0ID0gIihOYU4pIiB9LCAnXDAnKTsKCiAJcmV0dXJuIDA7Cn0=