void-packages/srcpkgs/ilmbase/files/toFloat.sh

72 lines
1.2 KiB
Bash

#!/bin/sh
halfToFloat() {
local s=$1 e=$2 m=$3
if [ $e -eq 0 ]; then
if [ $m -eq 0 ]; then
# Plus or minus zero
echo $((s << 31))
return
else
# Denormalized number -- renormalize it
while [ $((m & 0x400)) -eq 0 ]; do
m=$((m << 1))
e=$((e - 1))
done
e=$((e + 1))
m=$((m & 0x3ff))
fi
elif [ $e -eq 31 ]; then
if [ "$m" -eq 0 ]; then
# Positive or negative infinity
echo $(((s << 31) | 0x7f800000))
return
else
# Nan - preserve sign and significand bits
echo $(((s << 31) | 0x7f800000 | (m << 13)))
return
fi
fi
# Normalized number
e=$((e + (127 - 15)))
m=$((m << 13))
# Assemble s, e and m
echo $(((s << 31) | (e << 23) | m))
}
echo "//"
echo "// This is an automatically generated file."
echo "// Do not edit."
echo "//"
echo ""
echo "{"
echo -n " "
s=0
m=0
e=0
j=0
k=0
while [ $s -lt 2 ]; do
while [ $e -lt 32 ]; do
while [ $m -lt 1024 ]; do
out="$(halfToFloat $s $e $m)"
printf "{0x%08x}, " $out
m=$((m + 1))
j=$((j + 1))
if [ $j -eq 4 ]; then
printf "\n"
k=$((k + 1))
[ $k -lt 16384 ] && printf " "
j=0
fi
done
m=0
e=$((e + 1))
done
e=0
s=$((s + 1))
done
echo "};"