Floating point 使用flocq定义浮点数和证明
我正在试图弄清楚如何使用flocq包。下面我有一个简单的脚本,在这里我创建了一个简单的函数。但是我不知道如何创建两个binary32来计算这个函数。我被困在如何创建“有界”的证明上。我还想证明,例如,对于一个特定的x和y,我不会得到一个NaN。这就是flocq所擅长的事情吗?或者我应该调查另一个包裹?感谢您的帮助Floating point 使用flocq定义浮点数和证明,floating-point,coq,Floating Point,Coq,我正在试图弄清楚如何使用flocq包。下面我有一个简单的脚本,在这里我创建了一个简单的函数。但是我不知道如何创建两个binary32来计算这个函数。我被困在如何创建“有界”的证明上。我还想证明,例如,对于一个特定的x和y,我不会得到一个NaN。这就是flocq所擅长的事情吗?或者我应该调查另一个包裹?感谢您的帮助 Require Import Psatz. From Flocq Require Import Fcore_FTZ Fcore Fcalc_ops Fappli_IEEE Fappli
Require Import Psatz.
From Flocq Require Import Fcore_FTZ Fcore Fcalc_ops Fappli_IEEE Fappli_IEEE_bits.
Definition b32_my_fun (x y : binary32) : binary32 :=
b32_div mode_NE (b32_plus mode_NE x y) y.
我通过研究CompCert中包含的flocq副本拼凑出了这个答案。您可能有兴趣了解CompCert的
lib/Floats.v
,尤其是lib/Fappli\u IEEE\u extra.v
,它在flocq的基础上增加了一些便利功能。(这也意味着我的答案可能不适用于香草flocq,但我认为应该适用。)
要创建binary32
,请使用Fappli\u IEEE
中的flocq的binary\u normalize
函数。其类型如下:
binary_normalize
: forall prec emax : Z,
Prec_gt_0 prec -> prec < emax -> mode -> Z -> Z -> bool -> binary_float prec emax
它仍然需要提供两个简单目标的证明:Prec\u gt_0 24
和24<128
。在交互模式下,这两种情况都可以通过自反性来证明:
Goal Prec_gt_0 24.
Proof.
reflexivity.
Qed.
此类证明的证明术语仅为eq\u refl
(例如,您可以在Qed.
之前使用Show-proof.
进行检查)。因此,我们得出:
Check (binary_normalize 24 128 eq_refl eq_refl mode_NE 42 23 false).
binary_normalize 24 128 eq_refl eq_refl mode_NE 42 23 false
: binary_float 24 128
我们可以看到这一点的真正内部表现:
Eval simpl in (binary_normalize 24 128 eq_refl eq_refl mode_NE 42 23 false).
= B754_finite 24 128 false 11010048 (FLT_exp (-149) 24 29)
(proj1 (binary_round_correct 24 128 eq_refl eq_refl mode_NE false 42 23))
: binary_float 24 128
Eval compute in (binary_normalize 24 128 eq_refl eq_refl mode_NE 42 23 false).
= B754_finite 24 128 false 11010048 5
(proj1 (binary_round_correct 24 128 eq_refl eq_refl mode_NE false 42 23))
: binary_float 24 128
最后,我们可以将其打包成一个漂亮的小函数:
Definition my_binary32 (mantissa exponent: Z): binary32 :=
binary_normalize 24 128 eq_refl eq_refl mode_NE mantissa exponent false.
并测试它:
Eval simpl in (my_binary32 42 23).
= B754_finite 24 128 false 11010048 (FLT_exp (-149) 24 29)
(proj1 (binary_round_correct 24 128 eq_refl eq_refl mode_NE false 42 23))
: binary32
Eval simpl in (my_binary32 42 230).
= B754_infinity 24 128 false
: binary32
谢谢你的帮助。感谢您为查找证明术语eq\u refl
和花式where
子句所做的技巧!
Eval simpl in (my_binary32 42 23).
= B754_finite 24 128 false 11010048 (FLT_exp (-149) 24 29)
(proj1 (binary_round_correct 24 128 eq_refl eq_refl mode_NE false 42 23))
: binary32
Eval simpl in (my_binary32 42 230).
= B754_infinity 24 128 false
: binary32