代码之家  ›  专栏  ›  技术社区  ›  Ulysse BN

如何在PostgreSQL中钳制浮点

  •  0
  • Ulysse BN  · 技术社区  · 6 年前

    我有一个数字1.00000001,我想把它夹在-1和1之间以避免 输入超出范围错误 在…上 ACOS() 作用MCVE看起来像这样:

    SELECT ACOS( 1 + 0.0000000001 );
    

    我的理想是:

    SELECT ACOS( CLAMP(1 + 0.0000000001, -1, 1) );  
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   Ulysse BN    6 年前

    我找到的解决方案是:

    SELECT ACOS(GREATEST(-1, LEAST(1, 1 + 0.0000000001));
    
        2
  •  2
  •   srghma    5 年前
    -- example: clamp(subject, min, max)
    CREATE FUNCTION clamp(integer, integer, integer) RETURNS integer
        AS 'select GREATEST($2, LEAST($3, $1));'
        LANGUAGE SQL
        IMMUTABLE
        RETURNS NULL ON NULL INPUT;
    
    -- example: clamp_above(subject, max)
    CREATE FUNCTION clamp_above(integer, integer) RETURNS integer
        AS 'select LEAST($1, $2);'
        LANGUAGE SQL
        IMMUTABLE
        RETURNS NULL ON NULL INPUT;
    
    -- example: clamp_below(subject, min)
    CREATE FUNCTION clamp_below(integer, integer) RETURNS integer
        AS 'select GREATEST($1, $2);'
        LANGUAGE SQL
        IMMUTABLE
        RETURNS NULL ON NULL INPUT;