summaryrefslogtreecommitdiff
path: root/src/test_streams/main.c
diff options
context:
space:
mode:
authorJosh Coalson <jcoalson@users.sourceforce.net>2003-05-19 04:23:30 +0000
committerJosh Coalson <jcoalson@users.sourceforce.net>2003-05-19 04:23:30 +0000
commitaf9c773da3dab0d6574ff4a57902d3ef94f7c3a4 (patch)
tree24a95ae2734d3df89290904b933a1fc0a40e8126 /src/test_streams/main.c
parent9f88dc25dfd377d4b0dd33c1b51159162fcfb92d (diff)
downloadflac-af9c773da3dab0d6574ff4a57902d3ef94f7c3a4.tar.gz
add Brady's better write_sane_extended()
Diffstat (limited to 'src/test_streams/main.c')
-rw-r--r--src/test_streams/main.c39
1 files changed, 21 insertions, 18 deletions
diff --git a/src/test_streams/main.c b/src/test_streams/main.c
index 82384adc..71c8feea 100644
--- a/src/test_streams/main.c
+++ b/src/test_streams/main.c
@@ -141,33 +141,36 @@ static FLAC__bool write_big_endian_int32(FILE *f, FLAC__int32 x)
#endif
static FLAC__bool write_sane_extended(FILE *f, unsigned val)
-{
- unsigned i, exponent;
-
- /* this reasonable limitation make the implementation simpler */
- FLAC__ASSERT(val < 0x80000000);
-
- /* we'll use the denormalized form, with no implicit '1' (i bit == 0) */
-
- for(i = val, exponent = 0; i; i >>= 1, exponent++)
+ /* Write to 'f' a SANE extended representation of 'val'. Return false if
+ * the write succeeds; return true otherwise.
+ *
+ * SANE extended is an 80-bit IEEE-754 representation with sign bit, 15 bits
+ * of exponent, and 64 bits of significand (mantissa). Unlike most IEEE-754
+ * representations, it does not imply a 1 above the MSB of the significand.
+ *
+ * Preconditions:
+ * val!=0U
+ */
+{
+ unsigned int shift, exponent;
+
+ FLAC__ASSERT(val!=0U); /* handling 0 would require a special case */
+
+ for(shift= 0U; (val>>(31-shift))==0U; ++shift)
;
- if(!write_big_endian_uint16(f, (FLAC__uint16)(exponent + 16383)))
- return false;
+ val<<= shift;
+ exponent= 63U-(shift+32U); /* add 32 for unused second word */
- for(i = 32; i; i--) {
- if(val & 0x40000000)
- break;
- val <<= 1;
- }
+ if(!write_big_endian_uint16(f, (FLAC__uint16)(exponent+0x3FFF)))
+ return false;
if(!write_big_endian_uint32(f, val))
return false;
- if(!write_big_endian_uint32(f, 0))
+ if(!write_big_endian_uint32(f, 0)) /* unused second word */
return false;
return true;
}
-
/* a mono one-sample 16bps stream */
static FLAC__bool generate_01()
{