Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Firebird是否支持无穷大作为浮点值?_Sql_Floating Point_Firebird - Fatal编程技术网

Sql Firebird是否支持无穷大作为浮点值?

Sql Firebird是否支持无穷大作为浮点值?,sql,floating-point,firebird,Sql,Floating Point,Firebird,Firebird支持特殊浮点值无限和-无限作为双精度值: 从RDB$数据库中选择日志(1,1)、日志(1,0.5)、日志(1,1.5) 这就产生了 |LOG|LOG |LOG | |---|---------|---------| |NaN|-Infinity|+Infinity| 。而NaN也作为FLOAT值存在: 从RDB$数据库中选择cast(日志(1,1)作为float) 无法将无穷大转换为浮点值: 从RDB$数据库中选择cast(日志(1,1.5)作为floa

Firebird支持特殊浮点值
无限
-无限
作为
双精度
值:

从RDB$数据库中选择日志(1,1)、日志(1,0.5)、日志(1,1.5)
这就产生了

|LOG|LOG      |LOG      |
|---|---------|---------|
|NaN|-Infinity|+Infinity|
。而
NaN
也作为
FLOAT
值存在:

从RDB$数据库中选择cast(日志(1,1)作为float)
无法将无穷大转换为浮点值:

从RDB$数据库中选择cast(日志(1,1.5)作为float)
我得到:

SQL错误[335544916][22003]:算术异常、数字溢出或字符串截断;数值超出范围[SQLState:22003,ISC错误代码:335544916]


在Firebird中,是否有任何记录或未记录的方法来获取类型为无限的
FLOAT

答案是,它很复杂。虽然Firebird的浮点类型在某些情况下可以保存/存储NaN和Infinity,但它不支持对
FLOAT
的强制转换中的Infinity(因此,对赋值转换也不支持),因为对FLOAT的强制转换执行范围检查,并且-Infinity和+Infinity超出范围

我不确定这是否是故意的,但可能是因为标准中如何指定了
CAST
(尽管NaN的行为有问题)。事实上,我甚至不确定对NaN和Infinity的支持是故意的行为,或者只是支持NaN和Infinity的底层实现的副作用

例如,可以存储无穷大:

publicstaticvoidmain(字符串[]args)抛出SQLException{
try(var connection=DefaultDb.createDefaultConnection();
var pstmt=connection.prepareStatement(“插入到withfloat(floatval)值(?)){
pstmt.setFloat(1,Float.正无穷大);
pstmt.execute();
}
}
然而,据我所知,没有办法在DSQL本身中生成这些值

我建议将此报告为上的bug,但我不确定该bug是否可能生成和存储NaN/Infinity,还是
CAST
的行为。而且我担心修复这两种方法都会有问题:不允许是向后不兼容的,而允许
强制转换将违反标准

作为记录,SQL标准没有为浮点类型指定任何关于NaN和Infinity的内容,但规范的其余部分明确指出不应支持NaN和Infinity。例如,对于
LOG
,它指定:

  • 如果指定了,则让VB为的值,让VA为的值。
    案例:
    a) 如果VA和VB中至少有一个为空值,则结果为空值。
    b) 如果VA为负值或0(零),则引发异常条件:数据异常-数值超出范围。
    c) 如果VB为负、0(零)或1(一),则会引发异常条件:数据异常-数值超出范围_ d) 否则,结果是以VB为底的VA的对数

  • 换句话说,
    LOG(1,)
    应该引发一个数据异常-数值超出范围,而不是产生NaN或+/-无穷大。

    没有像
    real
    这样的类型-它应该是您自己创建的(SQL
    DOMAIN
    )而不是任何Firebird的数据类型?很好。SQL标准规定了
    REAL
    双精度
    (均为固定精度)和
    FLOAT
    DECFLOAT
    类型(具有可配置精度)。有些方言将其中一些类型用作其他类型的同义词。火鸟似乎也这么做了。术语
    REAL
    在您的链接中被进一步引用:。无论如何,我会更新我的问题。它仍然适用于
    FLOAT
    @Arioch',事实上,Firebird中有一个
    REAL
    (自InterBase 6.0 AFAIK以来),只是从来没有记录过,我在Firebird 4发行说明中修复了这个问题。在Firebird
    REAL
    中,REAL
    FLOAT
    的同义词(或者-由于Firebird 4-
    FLOAT(p)
    与p@LukasEder一起使用,因此该部分中的术语
    REAL
    更准确地说是“浮点”,而不是指SQL
    REAL
    。@LukasEder,例如,2.4表没有列出正式的类型名称“二进制字符串”和“空状态”,但似乎存在“非正式”类型“…类似地,在Firebird 4中,这也会产生一个错误:
    select cast(cast(log(1,1.5)作为decfloat)作为双精度)从rdb$database;
    我创建了以下问题:。出于一致性原因,我认为
    CAST
    应该可以工作,因为
    NaN
    CAST已经可以工作了,而且许多其他RDBMS也支持SQL标准的这些扩展