#include <stdio.h>
#include <limits.h>
#if UINT_MAX >= 0xFFFFFFFF
typedef unsigned uint32;
#else
typedef unsigned long uint32;
#endif
#define C_ASSERT(expr) extern char CAssertExtern[(expr)?1:-1]
// Ensure uint32 is exactly 32-bit
C_ASSERT(sizeof(uint32) * CHAR_BIT == 32);
// Ensure float has the same number of bits as uint32, 32
C_ASSERT(sizeof(uint32) == sizeof(float));
double Ieee754SingleDigits2DoubleCheat(const char s[32])
{
uint32 v;
float f;
unsigned i;
char *p1 = (char*)&v, *p2 = (char*)&f;
// Collect binary digits into an integer variable
v = 0;
for (i = 0; i < 32; i++)
v = (v << 1) + (s[i] - '0');
// Copy the bits from the integer variable to a float variable
for (i = 0; i < sizeof(f); i++)
*p2++ = *p1++;
return f;
}
double Ieee754SingleDigits2DoubleNoCheat(const char s[32])
{
double f;
uint32 mant;
int i;
// Do you really need strto*() here?
sign = s[0] - '0';
// Do you really need strto*() or pow() here?
for (i = 1; i <= 8; i++)
// Remove the exponent bias
// Should really check for +/-Infinity and NaNs here
{
// Normal(ized) numbers
mant = 1; // The implicit "1."
// Account for "1." being in bit position 23 instead of bit position 0
}
else
{
// Subnormal numbers
mant = 0; // No implicit "1."
exp = -126; // See your IEEE-54 formulas // Account for ".1" being in bit position 22 instead of bit position -1
}
// Or do you really need strto*() or pow() here?
for (i = 9; i <= 31; i++)
mant = mant * 2 + (s[i] - '0');
f = mant;
// Do you really need pow() here?
f *= 2, exp--;
// Or here?
if (sign)
f = -f;
return f;
}
int main(void)
{
printf("%+g\n", Ieee754SingleDigits2DoubleCheat
("110000101100010010000000000000000")); printf("%+g\n", Ieee754SingleDigits2DoubleNoCheat
("010000101100010010000000000000000")); printf("%+g\n", Ieee754SingleDigits2DoubleCheat
("000000000100000000000000000000000")); printf("%+g\n", Ieee754SingleDigits2DoubleNoCheat
("100000000100000000000000000000000")); printf("%+g\n", Ieee754SingleDigits2DoubleCheat
("000000000000000000000000000000000")); printf("%+g\n", Ieee754SingleDigits2DoubleNoCheat
("000000000000000000000000000000000")); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxsaW1pdHMuaD4KCiNpZiBVSU5UX01BWCA+PSAweEZGRkZGRkZGCnR5cGVkZWYgdW5zaWduZWQgdWludDMyOwojZWxzZQp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWludDMyOwojZW5kaWYKCiNkZWZpbmUgQ19BU1NFUlQoZXhwcikgZXh0ZXJuIGNoYXIgQ0Fzc2VydEV4dGVyblsoZXhwcik/MTotMV0KCi8vIEVuc3VyZSB1aW50MzIgaXMgZXhhY3RseSAzMi1iaXQKQ19BU1NFUlQoc2l6ZW9mKHVpbnQzMikgKiBDSEFSX0JJVCA9PSAzMik7CgovLyBFbnN1cmUgZmxvYXQgaGFzIHRoZSBzYW1lIG51bWJlciBvZiBiaXRzIGFzIHVpbnQzMiwgMzIKQ19BU1NFUlQoc2l6ZW9mKHVpbnQzMikgPT0gc2l6ZW9mKGZsb2F0KSk7Cgpkb3VibGUgSWVlZTc1NFNpbmdsZURpZ2l0czJEb3VibGVDaGVhdChjb25zdCBjaGFyIHNbMzJdKQp7CiAgdWludDMyIHY7CiAgZmxvYXQgZjsKICB1bnNpZ25lZCBpOwogIGNoYXIgKnAxID0gKGNoYXIqKSZ2LCAqcDIgPSAoY2hhciopJmY7CgogIC8vIENvbGxlY3QgYmluYXJ5IGRpZ2l0cyBpbnRvIGFuIGludGVnZXIgdmFyaWFibGUKICB2ID0gMDsKICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKICAgIHYgPSAodiA8PCAxKSArIChzW2ldIC0gJzAnKTsKCiAgLy8gQ29weSB0aGUgYml0cyBmcm9tIHRoZSBpbnRlZ2VyIHZhcmlhYmxlIHRvIGEgZmxvYXQgdmFyaWFibGUKICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGYpOyBpKyspCiAgICAqcDIrKyA9ICpwMSsrOwoKICByZXR1cm4gZjsKfQoKZG91YmxlIEllZWU3NTRTaW5nbGVEaWdpdHMyRG91YmxlTm9DaGVhdChjb25zdCBjaGFyIHNbMzJdKQp7CiAgZG91YmxlIGY7CiAgaW50IHNpZ24sIGV4cDsKICB1aW50MzIgbWFudDsKICBpbnQgaTsKCiAgLy8gRG8geW91IHJlYWxseSBuZWVkIHN0cnRvKigpIGhlcmU/CiAgc2lnbiA9IHNbMF0gLSAnMCc7CgogIC8vIERvIHlvdSByZWFsbHkgbmVlZCBzdHJ0byooKSBvciBwb3coKSBoZXJlPwogIGV4cCA9IDA7CiAgZm9yIChpID0gMTsgaSA8PSA4OyBpKyspCiAgICBleHAgPSBleHAgKiAyICsgKHNbaV0gLSAnMCcpOwoKICAvLyBSZW1vdmUgdGhlIGV4cG9uZW50IGJpYXMKICBleHAgLT0gMTI3OwoKICAvLyBTaG91bGQgcmVhbGx5IGNoZWNrIGZvciArLy1JbmZpbml0eSBhbmQgTmFOcyBoZXJlCgogIGlmIChleHAgPiAtMTI3KQogIHsKICAgIC8vIE5vcm1hbChpemVkKSBudW1iZXJzCiAgICBtYW50ID0gMTsgLy8gVGhlIGltcGxpY2l0ICIxLiIKICAgIC8vIEFjY291bnQgZm9yICIxLiIgYmVpbmcgaW4gYml0IHBvc2l0aW9uIDIzIGluc3RlYWQgb2YgYml0IHBvc2l0aW9uIDAKICAgIGV4cCAtPSAyMzsKICB9CiAgZWxzZQogIHsKICAgIC8vIFN1Ym5vcm1hbCBudW1iZXJzCiAgICBtYW50ID0gMDsgLy8gTm8gaW1wbGljaXQgIjEuIgogICAgZXhwID0gLTEyNjsgLy8gU2VlIHlvdXIgSUVFRS01NCBmb3JtdWxhcwogICAgLy8gQWNjb3VudCBmb3IgIi4xIiBiZWluZyBpbiBiaXQgcG9zaXRpb24gMjIgaW5zdGVhZCBvZiBiaXQgcG9zaXRpb24gLTEKICAgIGV4cCAtPSAyMzsKICB9CgogIC8vIE9yIGRvIHlvdSByZWFsbHkgbmVlZCBzdHJ0byooKSBvciBwb3coKSBoZXJlPwogIGZvciAoaSA9IDk7IGkgPD0gMzE7IGkrKykKICAgIG1hbnQgPSBtYW50ICogMiArIChzW2ldIC0gJzAnKTsKCiAgZiA9IG1hbnQ7CgogIC8vIERvIHlvdSByZWFsbHkgbmVlZCBwb3coKSBoZXJlPwogIHdoaWxlIChleHAgPiAwKQogICAgZiAqPSAyLCBleHAtLTsKCiAgLy8gT3IgaGVyZT8KICB3aGlsZSAoZXhwIDwgMCkKICAgIGYgLz0gMiwgZXhwKys7CgogIGlmIChzaWduKQogICAgZiA9IC1mOwoKICByZXR1cm4gZjsKfQoKaW50IG1haW4odm9pZCkKewogIHByaW50ZigiJStnXG4iLCBJZWVlNzU0U2luZ2xlRGlnaXRzMkRvdWJsZUNoZWF0KCIxMTAwMDAxMDExMDAwMTAwMTAwMDAwMDAwMDAwMDAwMDAiKSk7CiAgcHJpbnRmKCIlK2dcbiIsIEllZWU3NTRTaW5nbGVEaWdpdHMyRG91YmxlTm9DaGVhdCgiMDEwMDAwMTAxMTAwMDEwMDEwMDAwMDAwMDAwMDAwMDAwIikpOwogIHByaW50ZigiJStnXG4iLCBJZWVlNzU0U2luZ2xlRGlnaXRzMkRvdWJsZUNoZWF0KCIwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiKSk7CiAgcHJpbnRmKCIlK2dcbiIsIEllZWU3NTRTaW5nbGVEaWdpdHMyRG91YmxlTm9DaGVhdCgiMTAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIikpOwogIHByaW50ZigiJStnXG4iLCBJZWVlNzU0U2luZ2xlRGlnaXRzMkRvdWJsZUNoZWF0KCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiKSk7CiAgcHJpbnRmKCIlK2dcbiIsIEllZWU3NTRTaW5nbGVEaWdpdHMyRG91YmxlTm9DaGVhdCgiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIikpOwogIHJldHVybiAwOwp9Cg==