Sophie

Sophie

distrib > Mageia > 6 > armv5tl > media > core-release > by-pkgid > 3c7997fe0e8405f6d7b5563e63d17a78 > files > 81

coq-flocq-2.5.1-2.mga6.armv5tl.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="coqdoc.css" rel="stylesheet" type="text/css" />
<title>Flocq.Calc.Fcalc_sqrt</title>
</head>

<body>

<div id="page">

<div id="header">
</div>

<div id="main">

<h1 class="libtitle">Library Flocq.Calc.Fcalc_sqrt</h1>

<div class="code">
</div>

<div class="doc">
This file is part of the Flocq formalization of floating-point
arithmetic in Coq: http://flocq.gforge.inria.fr/

<div class="paragraph"> </div>

Copyright (C) 2010-2013 Sylvie Boldo
<br />
Copyright (C) 2010-2013 Guillaume Melquiond

<div class="paragraph"> </div>

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 3 of the License, or (at your option) any later version.

<div class="paragraph"> </div>

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
COPYING file for more details.

<div class="paragraph"> </div>

<a name="lab17"></a><h1 class="section">Helper functions and theorems for computing the rounded square root of a floating-point number.</h1>

</div>
<div class="code">

<br/>
<span class="id" title="keyword">Require</span> <span class="id" title="keyword">Import</span> <a class="idref" href="Flocq.Core.Fcore_Raux.html#"><span class="id" title="library">Fcore_Raux</span></a>.<br/>
<span class="id" title="keyword">Require</span> <span class="id" title="keyword">Import</span> <a class="idref" href="Flocq.Core.Fcore_defs.html#"><span class="id" title="library">Fcore_defs</span></a>.<br/>
<span class="id" title="keyword">Require</span> <span class="id" title="keyword">Import</span> <a class="idref" href="Flocq.Core.Fcore_digits.html#"><span class="id" title="library">Fcore_digits</span></a>.<br/>
<span class="id" title="keyword">Require</span> <span class="id" title="keyword">Import</span> <a class="idref" href="Flocq.Core.Fcore_float_prop.html#"><span class="id" title="library">Fcore_float_prop</span></a>.<br/>
<span class="id" title="keyword">Require</span> <span class="id" title="keyword">Import</span> <a class="idref" href="Flocq.Calc.Fcalc_bracket.html#"><span class="id" title="library">Fcalc_bracket</span></a>.<br/>
<span class="id" title="keyword">Require</span> <span class="id" title="keyword">Import</span> <a class="idref" href="Flocq.Calc.Fcalc_digits.html#"><span class="id" title="library">Fcalc_digits</span></a>.<br/>

<br/>
<span class="id" title="keyword">Section</span> <a name="Fcalc_sqrt"><span class="id" title="section">Fcalc_sqrt</span></a>.<br/>

<br/>
<span class="id" title="keyword">Variable</span> <span class="id" title="keyword">beta</span> : <a class="idref" href="Flocq.Core.Fcore_Zaux.html#radix"><span class="id" title="record">radix</span></a>.<br/>
<span class="id" title="keyword">Notation</span> <a name="bpow"><span class="id" title="abbreviation">bpow</span></a> <span class="id" title="var">e</span> := (<a class="idref" href="Flocq.Core.Fcore_Raux.html#bpow"><span class="id" title="definition">bpow</span></a> <span class="id" title="keyword">beta</span> <span class="id" title="var">e</span>).<br/>

<br/>
</div>

<div class="doc">
Computes a mantissa of precision p, the corresponding exponent,
    and the position with respect to the real square root of the
    input floating-point number.

<div class="paragraph"> </div>

The algorithm performs the following steps:

<div class="paragraph"> </div>

<ul class="doclist">
<li> Shift the mantissa so that it has at least 2p-1 digits;
  shift it one digit more if the new exponent is not even.

</li>
<li> Compute the square root s (at least p digits) of the new
  mantissa, and its remainder r.

</li>
<li> Compute the position according to the remainder:
<ul class="doclist">
<li>- r == 0  =&gt;  Eq,

</li>
<li>- r &lt;= s  =&gt;  Lo,

</li>
<li>- r &gt;= s  =&gt;  Up.

</li>
</ul>

</li>
</ul>
Complexity is fine as long as p1 &lt;= 2p-1.

</div>
<div class="code">

<br/>
<span class="id" title="keyword">Definition</span> <a name="Fsqrt_core"><span class="id" title="definition">Fsqrt_core</span></a> <span class="id" title="var">prec</span> <span class="id" title="var">m</span> <span class="id" title="var">e</span> :=<br/>
&nbsp;&nbsp;<span class="id" title="keyword">let</span> <span class="id" title="var">d</span> := <a class="idref" href="Flocq.Core.Fcore_digits.html#Zdigits"><span class="id" title="definition">Zdigits</span></a> <span class="id" title="keyword">beta</span> <a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#m"><span class="id" title="variable">m</span></a> <span class="id" title="keyword">in</span><br/>
&nbsp;&nbsp;<span class="id" title="keyword">let</span> <span class="id" title="var">s</span> := <a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.ZArith.BinInt.html#Zmax"><span class="id" title="abbreviation">Zmax</span></a> (2 <a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.ZArith.BinInt.html#88e34ed7a73f02772126289867960764"><span class="id" title="notation">×</span></a> <a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#prec"><span class="id" title="variable">prec</span></a> <a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.ZArith.BinInt.html#239a40728d107295b3cb2c790f57f9e9"><span class="id" title="notation">-</span></a> <a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#d"><span class="id" title="variable">d</span></a>) 0 <span class="id" title="keyword">in</span><br/>
&nbsp;&nbsp;<span class="id" title="keyword">let</span> <span class="id" title="var">e'</span> := (<a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#e"><span class="id" title="variable">e</span></a> <a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.ZArith.BinInt.html#239a40728d107295b3cb2c790f57f9e9"><span class="id" title="notation">-</span></a> <a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#s"><span class="id" title="variable">s</span></a>)%<span class="id" title="var">Z</span> <span class="id" title="keyword">in</span><br/>
&nbsp;&nbsp;<span class="id" title="keyword">let</span> (<span class="id" title="var">s'</span>, <span class="id" title="var">e''</span>) := <span class="id" title="keyword">if</span> <a class="idref" href="Flocq.Core.Fcore_Zaux.html#Zeven"><span class="id" title="definition">Zeven</span></a> <a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#e'"><span class="id" title="variable">e'</span></a> <span class="id" title="keyword">then</span> <a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.Init.Datatypes.html#44400027531d4bc3f586a1997dc874c0"><span class="id" title="notation">(</span></a><a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#s"><span class="id" title="variable">s</span></a><a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.Init.Datatypes.html#44400027531d4bc3f586a1997dc874c0"><span class="id" title="notation">,</span></a> <a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#e'"><span class="id" title="variable">e'</span></a><a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.Init.Datatypes.html#44400027531d4bc3f586a1997dc874c0"><span class="id" title="notation">)</span></a> <span class="id" title="keyword">else</span> <a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.Init.Datatypes.html#44400027531d4bc3f586a1997dc874c0"><span class="id" title="notation">(</span></a><a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#s"><span class="id" title="variable">s</span></a> <a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.ZArith.BinInt.html#a3448b794f7a26d611ad36492b5d640b"><span class="id" title="notation">+</span></a> 1<a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.Init.Datatypes.html#44400027531d4bc3f586a1997dc874c0"><span class="id" title="notation">,</span></a> <a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#e'"><span class="id" title="variable">e'</span></a> <a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.ZArith.BinInt.html#239a40728d107295b3cb2c790f57f9e9"><span class="id" title="notation">-</span></a> 1<a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.Init.Datatypes.html#44400027531d4bc3f586a1997dc874c0"><span class="id" title="notation">)</span></a>%<span class="id" title="var">Z</span> <span class="id" title="keyword">in</span><br/>
&nbsp;&nbsp;<span class="id" title="keyword">let</span> <span class="id" title="var">m'</span> :=<br/>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="id" title="keyword">match</span> <a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#s'"><span class="id" title="variable">s'</span></a> <span class="id" title="keyword">with</span><br/>
&nbsp;&nbsp;&nbsp;&nbsp;| <a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.Numbers.BinNums.html#Zpos"><span class="id" title="constructor">Zpos</span></a> <span class="id" title="var">p</span> ⇒ (<a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#m"><span class="id" title="variable">m</span></a> <a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.ZArith.BinInt.html#88e34ed7a73f02772126289867960764"><span class="id" title="notation">×</span></a> <a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.ZArith.Zpow_def.html#Zpower_pos"><span class="id" title="abbreviation">Zpower_pos</span></a> <span class="id" title="keyword">beta</span> <span class="id" title="var">p</span>)%<span class="id" title="var">Z</span><br/>
&nbsp;&nbsp;&nbsp;&nbsp;| <span class="id" title="var">_</span> ⇒ <a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#m"><span class="id" title="variable">m</span></a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="id" title="keyword">end</span> <span class="id" title="keyword">in</span><br/>
&nbsp;&nbsp;<span class="id" title="keyword">let</span> (<span class="id" title="var">q</span>, <span class="id" title="var">r</span>) := <a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.ZArith.BinInt.html#Z.sqrtrem"><span class="id" title="definition">Z.sqrtrem</span></a> <a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#m'"><span class="id" title="variable">m'</span></a> <span class="id" title="keyword">in</span><br/>
&nbsp;&nbsp;<span class="id" title="keyword">let</span> <span class="id" title="var">l</span> :=<br/>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="id" title="keyword">if</span> <a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.ZArith.Zbool.html#Zeq_bool"><span class="id" title="definition">Zeq_bool</span></a> <a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#r"><span class="id" title="variable">r</span></a> 0 <span class="id" title="keyword">then</span> <a class="idref" href="Flocq.Calc.Fcalc_bracket.html#loc_Exact"><span class="id" title="constructor">loc_Exact</span></a><br/>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="id" title="keyword">else</span> <a class="idref" href="Flocq.Calc.Fcalc_bracket.html#loc_Inexact"><span class="id" title="constructor">loc_Inexact</span></a> (<span class="id" title="keyword">if</span> <a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.ZArith.Zbool.html#Zle_bool"><span class="id" title="abbreviation">Zle_bool</span></a> <a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#r"><span class="id" title="variable">r</span></a> <a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#q"><span class="id" title="variable">q</span></a> <span class="id" title="keyword">then</span> <a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.Init.Datatypes.html#Lt"><span class="id" title="constructor">Lt</span></a> <span class="id" title="keyword">else</span> <a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.Init.Datatypes.html#Gt"><span class="id" title="constructor">Gt</span></a>) <span class="id" title="keyword">in</span><br/>
&nbsp;&nbsp;<a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.Init.Datatypes.html#44400027531d4bc3f586a1997dc874c0"><span class="id" title="notation">(</span></a><a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#q"><span class="id" title="variable">q</span></a><a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.Init.Datatypes.html#44400027531d4bc3f586a1997dc874c0"><span class="id" title="notation">,</span></a> <a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.ZArith.Zeven.html#Zdiv2"><span class="id" title="abbreviation">Zdiv2</span></a> <a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#e''"><span class="id" title="variable">e''</span></a><a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.Init.Datatypes.html#44400027531d4bc3f586a1997dc874c0"><span class="id" title="notation">,</span></a> <a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#l"><span class="id" title="variable">l</span></a><a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.Init.Datatypes.html#44400027531d4bc3f586a1997dc874c0"><span class="id" title="notation">)</span></a>.<br/>

<br/>
<span class="id" title="keyword">Theorem</span> <a name="Fsqrt_core_correct"><span class="id" title="lemma">Fsqrt_core_correct</span></a> :<br/>
&nbsp;&nbsp;<span class="id" title="keyword">∀</span> <span class="id" title="var">prec</span> <span class="id" title="var">m</span> <span class="id" title="var">e</span>,<br/>
&nbsp;&nbsp;(0 <a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.ZArith.BinInt.html#273beba4f3453dbb29192b3ac740bb71"><span class="id" title="notation">&lt;</span></a> <a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#m"><span class="id" title="variable">m</span></a>)%<span class="id" title="var">Z</span> <a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.Init.Logic.html#d43e996736952df71ebeeae74d10a287"><span class="id" title="notation">→</span></a><br/>
&nbsp;&nbsp;<span class="id" title="keyword">let</span> '<a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.Init.Datatypes.html#44400027531d4bc3f586a1997dc874c0"><span class="id" title="notation">(</span></a><span class="id" title="var">m'</span><a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.Init.Datatypes.html#44400027531d4bc3f586a1997dc874c0"><span class="id" title="notation">,</span></a> <span class="id" title="var">e'</span><a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.Init.Datatypes.html#44400027531d4bc3f586a1997dc874c0"><span class="id" title="notation">,</span></a> <span class="id" title="var">l</span><a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.Init.Datatypes.html#44400027531d4bc3f586a1997dc874c0"><span class="id" title="notation">)</span></a> := <a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#Fsqrt_core"><span class="id" title="definition">Fsqrt_core</span></a> <a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#prec"><span class="id" title="variable">prec</span></a> <a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#m"><span class="id" title="variable">m</span></a> <a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#e"><span class="id" title="variable">e</span></a> <span class="id" title="keyword">in</span><br/>
&nbsp;&nbsp;(<a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#prec"><span class="id" title="variable">prec</span></a> <a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.ZArith.BinInt.html#208bafb0e148fe7fb7dcd812c227f4ee"><span class="id" title="notation">≤</span></a> <a class="idref" href="Flocq.Core.Fcore_digits.html#Zdigits"><span class="id" title="definition">Zdigits</span></a> <span class="id" title="keyword">beta</span> <span class="id" title="var">m'</span>)%<span class="id" title="var">Z</span> <a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.Init.Logic.html#d82a7d96d3659d805ffe732283716822"><span class="id" title="notation">∧</span></a><br/>
&nbsp;&nbsp;<a class="idref" href="Flocq.Calc.Fcalc_bracket.html#inbetween_float"><span class="id" title="definition">inbetween_float</span></a> <span class="id" title="keyword">beta</span> <span class="id" title="var">m'</span> <span class="id" title="var">e'</span> (<a class="idref" href="http://coq.inria.fr/distrib/current/stdlib/Coq.Reals.R_sqrt.html#sqrt"><span class="id" title="definition">sqrt</span></a> (<a class="idref" href="Flocq.Core.Fcore_defs.html#F2R"><span class="id" title="definition">F2R</span></a> (<a class="idref" href="Flocq.Core.Fcore_defs.html#Float"><span class="id" title="constructor">Float</span></a> <span class="id" title="keyword">beta</span> <a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#m"><span class="id" title="variable">m</span></a> <a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#e"><span class="id" title="variable">e</span></a>))) <span class="id" title="var">l</span>.<br/>

<br/>
<span class="id" title="keyword">End</span> <a class="idref" href="Flocq.Calc.Fcalc_sqrt.html#Fcalc_sqrt"><span class="id" title="section">Fcalc_sqrt</span></a>.<br/>
</div>
</div>

<div id="footer">
<hr/><a href="index.html">Index</a><hr/>This page has been generated by <a href="http://coq.inria.fr/">coqdoc</a>
</div>

</div>

</body>
</html>