[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: int-function: programming error or bug?
From: |
Manuel Collado |
Subject: |
Re: int-function: programming error or bug? |
Date: |
Sat, 28 Feb 2009 01:01:53 +0100 |
User-agent: |
Thunderbird 2.0.0.19 (Windows/20081209) |
Aron Brunner escribió:
Dear Sir, dear Madame,
thank you very much for awk/gawk i work with over the last 10 years
with success and great joy.
With gawk 3.1.6 on Mandriva 2009.0 i get a result i don't understand:
The code
-----------------------------------------------
#!/usr/bin/awk -f
BEGIN {
for (alfa=8.6;alfa<=9.2;alfa=alfa+0.1) {
alfaint=int(alfa);
printf "%s%5.10f s%d\n","alfa=",alfa,"int(alfa)=",alfaint;
'%' missing in format. Should be.
printf "%s%5.10f %s%d\n","alfa=",alfa,"int(alfa)=",alfaint;
}
beta=9.0;
betaint=int(beta);
printf "%s%5.10f %s%d\n","beta=",beta,"int(beta)=",betaint;
}
-----------------------------------------------
gives the integer from alfa=9.0 to 8:
alfa=8.6000000000 int(alfa)=8
alfa=8.7000000000 int(alfa)=8
alfa=8.8000000000 int(alfa)=8
alfa=8.9000000000 int(alfa)=8
alfa=9.0000000000 int(alfa)=8
alfa=9.1000000000 int(alfa)=9
alfa=9.2000000000 int(alfa)=9
beta=9.0000000000 int(beta)=9
I suppose i wrote the code-lines in a wrong manner;
may i respectfully ask for information.
Most decimal floating point values don't have an exact internal binary
representation. A slight change in your code shows it clearly:
---------------------
BEGIN {
for (alfa=8.6;alfa<=9.2;alfa=alfa+0.1) {
alfaint=int(alfa);
printf "%s%5.20f %s%d\n","alfa=",alfa,"int(alfa)=",alfaint;
}
beta=9.0;
betaint=int(beta);
printf "%s%5.20f %s%d\n","beta=",beta,"int(beta)=",betaint;
}
----------------------
alfa=8.59999999999999964473 int(alfa)=8
alfa=8.69999999999999928946 int(alfa)=8
alfa=8.79999999999999893419 int(alfa)=8
alfa=8.89999999999999857891 int(alfa)=8
alfa=8.99999999999999822364 int(alfa)=8
alfa=9.09999999999999786837 int(alfa)=9
alfa=9.19999999999999751310 int(alfa)=9
beta=9.00000000000000000000 int(beta)=9
Nothing wrong with int(), as you can see.
Hint: use integral values in the for loop control:
for (alfa10=86; alfa10<=92; alfa10++) {
alfa = alfa10 / 10.0
...
}
--
Manuel Collado - http://lml.ls.fi.upm.es/~mcollado