PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Cara melemparkan byte tipe ke presisi ganda

Untuk tujuan ini, solusi terbaik yang mungkin adalah mengubahnya menjadi byte menggunakan standar IEEE754-1985 menggunakan perintah SQL.

Pertama diperlukan untuk memeriksa kasus khusus yang ditentukan oleh standar IEEE754-1985. Kemudian ikuti saja algoritma standar untuk mengonversi jika tidak dalam kasus khusus. Contoh kode di bawah ini.

Inputnya adalah bytea_value bytea, is_little_endian boolean kemudian bagi menjadi 4 byte seperti di bawah ini:

  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);

Kemudian dapatkan nilai biner dengan mempertimbangkan little endian atau big endian

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;

Sekarang periksa kasus khusus:

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;

Jika bukan milik kasus khusus, ubah saja seperti di bawah ini:

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. Django:NotImplementedError:annotate() + different(fields) tidak diimplementasikan

  2. Apakah ukuran yang dideklarasikan bidang varchar berdampak pada PostgreSQL?

  3. Cara menginstal PostgreSQL di macOS

  4. Apakah ada cara untuk meneruskan params ke postgres raw query di Rails?

  5. Hasil ekspor PostgreSQL sebagai CSV dari server jarak jauh