इस उद्देश्य के लिए सबसे अच्छा संभव समाधान है कि SQL कमांड का उपयोग करके IEEE754-1985 मानक का उपयोग करके बाइट्स में कनवर्ट किया जाए।
सबसे पहले IEEE754-1985 मानक द्वारा परिभाषित विशेष मामलों की जांच करना आवश्यक है। फिर अगर यह किसी विशेष मामले में नहीं है तो कनवर्ट करने के लिए मानक एल्गोरिदम का पालन करें। नमूना कोड नीचे है।
इनपुट हैं bytea_value bytea, is_little_endian boolean
फिर नीचे के रूप में 4 बाइट्स में विभाजित करें:
byte_array[0]:= get_byte(bytea_value, 0);
byte_array[1]:= get_byte(bytea_value, 1);
byte_array[2]:= get_byte(bytea_value, 2);
byte_array[3]:= get_byte(bytea_value, 3);
फिर छोटे एंडियन या बड़े एंडियन पर विचार करके बाइनरी मान प्राप्त करें
IF is_little_endian THEN
binary_value:= byte_array[0]::bit(8) || byte_array[1]::bit(8) || byte_array[2]::bit(8) || byte_array[3]::bit(8);
ELSE
binary_value:= byte_array[3]::bit(8) || byte_array[2]::bit(8) || byte_array[1]::bit(8) || byte_array[0]::bit(8);
END IF;
अब विशेष मामलों की जांच करें:
IF binary_value = '00000000000000000000000000000000' OR binary_value = '10000000000000000000000000000000' THEN -- IEEE754-1985 Zero
return 0.0;
END IF;
sign := substring(binary_value from 1 for 1);
exponent := substring(binary_value from 2 for 8);
mantissa := substring(binary_value from 10 for 23);
IF exponent = '11111111' THEN
IF mantissa = '00000000000000000000000' THEN -- IEEE754-1985 negative and positive infinity
IF sign = '1' THEN
return '-Infinity';
ELSE
return 'Infinity';
END IF;
ELSE
return 'NaN'; -- IEEE754-1985 Not a number
END IF;
END IF;
यदि यह किसी विशेष मामले से संबंधित नहीं है तो इसे नीचे के रूप में परिवर्तित करें:
exp := exponent::int;
IF exp > 126 THEN
exp := exp - 127;
ELSE
exp:= -exp;
END IF;
WHILE mantissa_index < 24 LOOP
IF substring(mantissa from mantissa_index for 1) = '1' THEN
result := result + power(2, -(mantissa_index));
END IF;
mantissa_index = mantissa_index + 1;
END LOOP;
result := result * power(2, exp);
IF(sign = '1') THEN
result = -result;
END IF;
return result;