-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathfloat.xml
More file actions
191 lines (168 loc) · 6.4 KB
/
float.xml
File metadata and controls
191 lines (168 loc) · 6.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: a1e3d629b4f01ee41bd38391cd5c6ae5ee894cb3 Maintainer: pastore Status: ready -->
<!-- CREDITS: SvenHolmgren -->
<sect1 xml:id="language.types.float" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Numeri floating point</title>
<para>
I valori floating point (anche conosciuti come "float", "double", o "numeri reali")
possono essere specificati utilizzando una delle seguenti sintassi:
</para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
$d = 1_234.567; // a partire da PHP 7.4.0
?>
]]>
</programlisting>
</informalexample>
<para>
Formalmente a partire da PHP 7.4.0 (in precedenza, i trattini bassi non erano consentiti):
</para>
<informalexample>
<programlisting>
<![CDATA[
LNUM [0-9]+(_[0-9]+)*
DNUM ({LNUM}?"."{LNUM}) | ({LNUM}"."{LNUM}?)
EXPONENT_DNUM (({LNUM} | {DNUM}) [eE][+-]? {LNUM})
]]>
</programlisting>
</informalexample>
<para>
La dimensione di una variabile float dipende dalla piattaforma in uso, sebbene un massimo di circa 1.8e308
con una precisione di circa 14 cifre decimali sia il valore comune (il formato a 64 bit
IEEE).
</para>
<warning xml:id="warn.float-precision">
<title>Precisione di un valore floating point</title>
<para>
I numeri floating point hanno una precisione limitata. Nonostante questa dipenda dal
sistema in uso. PHP tipicamente utilizza il formato IEEE 754 double-precision, il quale
pone un errore relativo massimo causato dall'arrotondamento nell'ordine di 1.11e-16.
Operazioni aritmetiche non elementari possono restituire un errore maggiore e, di conseguenza,
la propagazione dell'errore deve essere considerata quando più operazioni vengono eseguite
in successione.
</para>
<para>
In più, alcuni numeri razionali che sono esattamente rappresentabili come numeri
floating point in base 10, ad esempio <literal>0.1</literal> o
<literal>0.7</literal>), non hanno, al contrario, una rappresentazione come numeri
floating point in base 2, la quale viene utilizzata internamente dal sistema, indipendentemente dalla dimensione
della mantissa. Dunque, questi non possono essere convertiti nella loro controparte binaria
interna senza una piccola perdita di precisione. Ciò può portare a risultati
confusionari: per esempio, <literal>floor((0.1+0.7)*10)</literal> solitamente
ritornerà come risultato <literal>7</literal> invece di <literal>8</literal>,
in quanto la sua rappresentazione interna sarà qualcosa di simile a
<literal>7.9999999999999991118...</literal>.
</para>
<para>
Perciò non fate mai affidamento sui risultati numerici decimali sino all'ultima cifra e non comparate
numeri floating point direttamente per uguaglianza. Se è necessaria una maggior
precisione, sono disponibili le <link linkend="ref.bc">funzioni matematiche con precisione arbitraria</link>
e le funzioni <link linkend="ref.gmp">gmp</link>.
</para>
<para>
Per una "semplice" spiegazione, vedere la <link xlink:href="&url.floating.point.guide;">guida per floating point</link>,
la quale è anche intitolata "Why don’t my numbers add up?"
</para>
</warning>
<sect2 xml:id="language.types.float.casting">
<title>Conversione a float</title>
<sect3 xml:id="language.types.float.casting.from-string">
<title>Da stringhe</title>
<simpara>
Se la stringa è
<link linkend="language.types.numeric-strings">numerica</link>
o inizia con un numero, verrà risolta nel
valore float corrispondente, altrimenti verrà convertita in zero
(<literal>0</literal>).
</simpara>
</sect3>
<sect3 xml:id="language.types.float.casting.from-other">
<title>Da altri tipi</title>
<para>
Per i valori di altri tipi, la conversione viene eseguita convertendo il
valore prima in <type>int</type> e poi in <type>float</type>. Vedere
<link linkend="language.types.integer.casting">Conversione in numero intero</link>
per ulteriori informazioni.
</para>
<note>
<para>
Poiché alcuni tipi hanno un comportamento indefinito durante la conversione in
<type>int</type>, lo stesso vale durante la conversione in
<type>float</type>.
</para>
</note>
</sect3>
</sect2>
<sect2 xml:id="language.types.float.comparison">
<title>Comparare float</title>
<para>
Come fatto notare nell'esempio sopra, comparare valori floating point per uguaglianza potrebbe risultare
problematico a causa della loro rappresentazione interna. Tuttavia
esistono dei metodi per comparare dei valori floating point che aggirano
queste limitazioni.
</para>
<para>
Per confrontare valori floating point per uguaglianza viene scelto un limite superiore all'errore
relativo creato dall'arrotondamento. Questo valore è conosciuto come la macchina epsilon,
o unità roundoff, ed è la più piccola differenza accettabile nel calcolo.
</para>
<informalexample>
<simpara>
<varname>$a</varname> e <varname>$b</varname> sono uguali per 5 cifre di
precisione.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;
if(abs($a-$b) < $epsilon) {
echo "true";
}
?>
]]>
</programlisting>
</informalexample>
</sect2>
<sect2 xml:id="language.types.float.nan">
<title>NaN</title>
<para>
Alcune operazioni possono ritornare un valore rappresentato dalla costante
<constant>NAN</constant>. Questo risultato rappresenta un valore indefinito o
non presentabile nei calcoli di numeri floating point. Qualsiasi comparazione
per uguaglianza o per identicità di questo valore con qualsiasi altro, incluso sé stesso,
risulterà &false;.
</para>
<para>
Poiché <constant>NAN</constant> rappresenta un qualsiasi numero di differenti valori,
<constant>NAN</constant> non dovrebbe essere comparato ad altri valori, incluso
se stesso, e dovrebbe invece essere verificato tramite la funzione <function>is_nan</function>.
</para>
</sect2>
</sect1>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->