Floating point 使用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

我正在试图弄清楚如何使用flocq包。下面我有一个简单的脚本,在这里我创建了一个简单的函数。但是我不知道如何创建两个binary32来计算这个函数。我被困在如何创建“有界”的证明上。我还想证明,例如,对于一个特定的x和y,我不会得到一个NaN。这就是flocq所擅长的事情吗?或者我应该调查另一个包裹?感谢您的帮助

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