PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

टाइप बाइटिया को डबल प्रिसिजन के लिए कैसे कास्ट करें

इस उद्देश्य के लिए सबसे अच्छा संभव समाधान है कि 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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डेबियन पर PostGis स्थापित करते समय PGXS Makefile त्रुटि नहीं मिल सकती है

  2. PostgreSQL में सिंगल कोट्स और डबल कोट्स में क्या अंतर है?

  3. सॉकेट फ़ाइल /var/pgsql_socket/.s.PGSQL.5432 माउंटेन लायन में गुम (OS X सर्वर)

  4. क्या एकाधिक धागे बाध्य सेट पर डुप्लिकेट अपडेट का कारण बन सकते हैं?

  5. postgresql वापसी 0 यदि लौटाया गया मान शून्य है