sql >> Databáze >  >> RDS >> PostgreSQL

Jak přetypovat typ byte s dvojnásobnou přesností

Pro tento účel je nejlepším možným řešením převod na bajty pomocí standardu IEEE754-1985 pomocí příkazů SQL.

Nejprve je nutné zkontrolovat speciální případy definované standardem IEEE754-1985. Pak už jen postupujte podle standardního algoritmu pro převod, pokud se nejedná o žádné zvláštní případy. Ukázkový kód je níže.

Vstupy jsou bytea_value bytea, is_little_endian boolean poté rozdělte na 4 bajty, jak je uvedeno níže:

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

Poté získejte binární hodnotu tím, že vezmete v úvahu malý endian nebo velký 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;
 

Nyní zkontrolujte speciální případy:

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;

Pokud nepatří do žádných speciálních případů, převeďte jej následovně:

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. nejedná se o skupinovou funkci s jednou skupinou s volbou MAX

  2. Jak aktualizovat z výběru pomocí připojení

  3. Limit podmínky MySQL IN

  4. Nelze spustit plánovač web2py pomocí postgresql databáze