绿林网页 发表于 2012-8-11 01:37:34

此算式何解

float num1=0.56;

while(1==1)
{
num1=num1*10;
      Serial.print("ttnum=");
    Serial.println(num1);
   
       Serial.print("tttnum=");
    Serial.println((int)num1);
   
    t=num1-(int)num1;

   Serial.print("t=");
    Serial.println(t);
}
==================================

tnum=0.56

ttnum=5.60
tttnum=5
t=0.60

ttnum=56.00
tttnum=55
t=1.00

ttnum=560.00
tttnum=559
t=1.00

ttnum=5599.98
tttnum=5599
t=0.98
ttnum=55999.76
tttnum=-9537
t=65536.76
ttnum=559997.56
tttnum=-29827
t=589824.56


在上式中和输出结果中,当 num1=56时(int)num1 为何等于55   而不是56呢?

davidce 发表于 2012-8-11 08:36:49

num1=num1*10;
改成
num1=num1*10.0;

绿林网页 发表于 2012-8-11 10:44:02

能解释一下原因吗?

davidce 发表于 2012-8-11 11:49:49

num1*10; 应为10是int,num1这个float被自动转换成int,10.0是float类型。

绿林网页 发表于 2012-8-11 13:51:15

那56.00 int 也不应该是 55吧,应该是56才对啊?

绿林网页 发表于 2012-8-11 14:13:04

并且经过测试, num1=num1*10.0;
结果还是55,并不是56?

绿林网页 发表于 2012-8-11 14:15:46

num1=num1*10;
       Serial.print("ttnum=");
   Serial.println(num1);   
       Serial.print("tttnum=");
    Serial.println((int)num1);

ttnum=56.00
tttnum=55
t=1.00
根据结果能看出来,*10的时候,ttnum是浮点的,并不是int呀

珜羽 发表于 2012-8-11 14:30:08

davidce 发表于 2012-8-11 11:49 static/image/common/back.gif
num1*10; 应为10是int,num1这个float被自动转换成int,10.0是float类型。

在同一个公式中,精度是按照最高的来的。不会说folat当成int算。

davidce 发表于 2012-8-11 14:44:11

珜羽 发表于 2012-8-11 14:30 static/image/common/back.gif
在同一个公式中,精度是按照最高的来的。不会说folat当成int算。

那怎么解释?

绿林网页 发表于 2012-8-11 15:16:51

davidce 发表于 2012-8-11 14:44 static/image/common/back.gif
那怎么解释?

肯定有别的原因,从我输出里看得到 *10后输出的是 56.00 是浮点,不是56 不是int型的!

绿林网页 发表于 2012-8-11 15:42:44

fnum=0.01
num=0.10 num_t=0 t=0.10
num=1.00 num_t=0 t=1.00
num=10.00 num_t=9 t=1.00
num=100.00 num_t=99 t=1.00
fnum=0.02
num=0.20 num_t=0 t=0.20
num=2.00 num_t=1 t=1.00
num=20.00 num_t=19 t=1.00
num=200.00 num_t=199 t=1.00
fnum=0.03
num=0.30 num_t=0 t=0.30
num=3.00 num_t=2 t=1.00
num=30.00 num_t=29 t=1.00
num=300.00 num_t=299 t=1.00
fnum=0.04
num=0.40 num_t=0 t=0.40
num=4.00 num_t=3 t=1.00
num=40.00 num_t=39 t=1.00
num=400.00 num_t=399 t=1.00
fnum=0.05
num=0.50 num_t=0 t=0.50
num=5.00 num_t=4 t=1.00
num=50.00 num_t=49 t=1.00
num=500.00 num_t=499 t=1.00
fnum=0.06
num=0.60 num_t=0 t=0.60
num=6.00 num_t=5 t=1.00
num=60.00 num_t=59 t=1.00
num=600.00 num_t=599 t=1.00
fnum=0.07
num=0.70 num_t=0 t=0.70
num=7.00 num_t=6 t=1.00
num=70.00 num_t=69 t=1.00
num=700.00 num_t=699 t=1.00
fnum=0.08
num=0.80 num_t=0 t=0.80
num=8.00 num_t=7 t=1.00
num=80.00 num_t=79 t=1.00
num=800.00 num_t=799 t=1.00
fnum=0.09
num=0.90 num_t=0 t=0.90
num=9.00 num_t=8 t=1.00
num=90.00 num_t=89 t=1.00
num=900.00 num_t=899 t=1.00
fnum=0.10
num=1.00 num_t=0 t=1.00
num=10.00 num_t=9 t=1.00
num=100.00 num_t=99 t=1.00
num=1000.00 num_t=999 t=1.00
fnum=0.11
num=1.10 num_t=1 t=0.10
num=11.00 num_t=10 t=1.00
num=110.00 num_t=109 t=1.00
num=1100.00 num_t=1099 t=1.00
fnum=0.12
num=1.20 num_t=1 t=0.20
num=12.00 num_t=11 t=1.00
num=120.00 num_t=119 t=1.00
num=1200.00 num_t=1199 t=1.00
fnum=0.13
num=1.30 num_t=1 t=0.30
num=13.00 num_t=12 t=1.00
num=130.00 num_t=129 t=1.00
num=1300.00 num_t=1299 t=1.00
fnum=0.14
num=1.40 num_t=1 t=0.40
num=14.00 num_t=13 t=1.00
num=140.00 num_t=139 t=1.00
num=1400.00 num_t=1399 t=1.00
fnum=0.15
num=1.50 num_t=1 t=0.50
num=15.00 num_t=14 t=1.00
num=150.00 num_t=149 t=1.00
num=1500.00 num_t=1499 t=1.00
fnum=0.16
num=1.60 num_t=1 t=0.60
num=16.00 num_t=15 t=1.00
num=160.00 num_t=159 t=1.00
num=1600.00 num_t=1599 t=1.00
fnum=0.17
num=1.70 num_t=1 t=0.70
num=17.00 num_t=17 t=0.00
num=170.00 num_t=170 t=0.00
num=1700.00 num_t=1700 t=0.00
fnum=0.18
num=1.80 num_t=1 t=0.80
num=18.00 num_t=18 t=0.00
num=180.00 num_t=180 t=0.00
num=1800.00 num_t=1800 t=0.00
fnum=0.19
num=1.90 num_t=1 t=0.90
num=19.00 num_t=19 t=0.00
num=190.00 num_t=190 t=0.00
num=1900.00 num_t=1900 t=0.00
fnum=0.20
num=2.00 num_t=2 t=0.00
num=20.00 num_t=20 t=0.00
num=200.00 num_t=200 t=0.00
num=2000.00 num_t=2000 t=0.00
fnum=0.21
num=2.10 num_t=2 t=0.10
num=21.00 num_t=21 t=0.00
num=210.00 num_t=210 t=0.00
num=2100.00 num_t=2100 t=0.00
fnum=0.22
num=2.20 num_t=2 t=0.20
num=22.00 num_t=22 t=0.00
num=220.00 num_t=220 t=0.00
num=2200.00 num_t=2200 t=0.00
fnum=0.23
num=2.30 num_t=2 t=0.30
num=23.00 num_t=23 t=0.00
num=230.00 num_t=230 t=0.00
num=2300.00 num_t=2300 t=0.00
fnum=0.24
num=2.40 num_t=2 t=0.40
num=24.00 num_t=24 t=0.00
num=240.00 num_t=240 t=0.00
num=2400.00 num_t=2400 t=0.00
fnum=0.25
num=2.50 num_t=2 t=0.50
num=25.00 num_t=25 t=0.00
num=250.00 num_t=250 t=0.00
num=2500.00 num_t=2500 t=0.00
fnum=0.26
num=2.60 num_t=2 t=0.60
num=26.00 num_t=26 t=0.00
num=260.00 num_t=260 t=0.00
num=2600.00 num_t=2600 t=0.00
fnum=0.27
num=2.70 num_t=2 t=0.70
num=27.00 num_t=27 t=0.00
num=270.00 num_t=270 t=0.00
num=2700.00 num_t=2700 t=0.00
fnum=0.28
num=2.80 num_t=2 t=0.80
num=28.00 num_t=28 t=0.00
num=280.00 num_t=280 t=0.00
num=2800.00 num_t=2800 t=0.00
fnum=0.29
num=2.90 num_t=2 t=0.90
num=29.00 num_t=28 t=1.00
num=290.00 num_t=289 t=1.00
num=2900.00 num_t=2899 t=1.00
fnum=0.30
num=3.00 num_t=2 t=1.00
num=30.00 num_t=29 t=1.00
num=300.00 num_t=299 t=1.00
num=3000.00 num_t=2999 t=1.00
fnum=0.31
num=3.10 num_t=3 t=0.10
num=31.00 num_t=30 t=1.00
num=310.00 num_t=309 t=1.00
num=3100.00 num_t=3099 t=1.00
fnum=0.32
num=3.20 num_t=3 t=0.20
num=32.00 num_t=31 t=1.00
num=320.00 num_t=319 t=1.00
num=3200.00 num_t=3199 t=1.00
fnum=0.33
num=3.30 num_t=3 t=0.30
num=33.00 num_t=32 t=1.00
num=330.00 num_t=329 t=1.00
num=3300.00 num_t=3299 t=1.00
fnum=0.34
num=3.40 num_t=3 t=0.40
num=34.00 num_t=33 t=1.00
num=340.00 num_t=339 t=1.00
num=3400.00 num_t=3399 t=1.00
fnum=0.35
num=3.50 num_t=3 t=0.50
num=35.00 num_t=34 t=1.00
num=350.00 num_t=349 t=1.00
num=3500.00 num_t=3499 t=1.00
fnum=0.36
num=3.60 num_t=3 t=0.60
num=36.00 num_t=35 t=1.00
num=360.00 num_t=359 t=1.00
num=3600.00 num_t=3599 t=1.00
fnum=0.37
num=3.70 num_t=3 t=0.70
num=37.00 num_t=36 t=1.00
num=370.00 num_t=369 t=1.00
num=3700.00 num_t=3699 t=1.00
fnum=0.38
num=3.80 num_t=3 t=0.80
num=38.00 num_t=37 t=1.00
num=380.00 num_t=379 t=1.00
num=3800.00 num_t=3799 t=1.00
fnum=0.39
num=3.90 num_t=3 t=0.90
num=39.00 num_t=38 t=1.00
num=390.00 num_t=389 t=1.00
num=3900.00 num_t=3899 t=1.00
fnum=0.40
num=4.00 num_t=3 t=1.00
num=40.00 num_t=39 t=1.00
num=400.00 num_t=399 t=1.00
num=4000.00 num_t=3999 t=1.00
fnum=0.41
num=4.10 num_t=4 t=0.10
num=41.00 num_t=40 t=1.00
num=410.00 num_t=409 t=1.00
num=4100.00 num_t=4099 t=1.00
fnum=0.42
num=4.20 num_t=4 t=0.20
num=42.00 num_t=41 t=1.00
num=420.00 num_t=419 t=1.00
num=4200.00 num_t=4199 t=1.00
fnum=0.43
num=4.30 num_t=4 t=0.30
num=43.00 num_t=42 t=1.00
num=430.00 num_t=429 t=1.00
num=4300.00 num_t=4299 t=1.00
fnum=0.44
num=4.40 num_t=4 t=0.40
num=44.00 num_t=43 t=1.00
num=440.00 num_t=439 t=1.00
num=4400.00 num_t=4399 t=1.00
fnum=0.45
num=4.50 num_t=4 t=0.50
num=45.00 num_t=44 t=1.00
num=450.00 num_t=449 t=1.00
num=4500.00 num_t=4499 t=1.00
fnum=0.46
num=4.60 num_t=4 t=0.60
num=46.00 num_t=45 t=1.00
num=460.00 num_t=459 t=1.00
num=4600.00 num_t=4599 t=1.00
fnum=0.47
num=4.70 num_t=4 t=0.70
num=47.00 num_t=46 t=1.00
num=470.00 num_t=469 t=1.00
num=4700.00 num_t=4699 t=1.00
fnum=0.48
num=4.80 num_t=4 t=0.80
num=48.00 num_t=47 t=1.00
num=480.00 num_t=479 t=1.00
num=4800.00 num_t=4799 t=1.00
fnum=0.49
num=4.90 num_t=4 t=0.90
num=49.00 num_t=48 t=1.00
num=490.00 num_t=489 t=1.00
num=4900.00 num_t=4899 t=1.00
fnum=0.50
num=5.00 num_t=4 t=1.00
num=50.00 num_t=49 t=1.00
num=500.00 num_t=499 t=1.00
num=5000.00 num_t=4999 t=1.00
fnum=0.51
num=5.10 num_t=5 t=0.10
num=51.00 num_t=50 t=1.00
num=510.00 num_t=509 t=1.00
num=5100.00 num_t=5099 t=1.00
fnum=0.52
num=5.20 num_t=5 t=0.20
num=52.00 num_t=51 t=1.00
num=520.00 num_t=519 t=1.00
num=5200.00 num_t=5199 t=1.00
fnum=0.53
num=5.30 num_t=5 t=0.30
num=53.00 num_t=52 t=1.00
num=530.00 num_t=529 t=1.00
num=5300.00 num_t=5299 t=1.00
fnum=0.54
num=5.40 num_t=5 t=0.40
num=54.00 num_t=53 t=1.00
num=540.00 num_t=539 t=1.00
num=5400.00 num_t=5399 t=1.00
fnum=0.55
num=5.50 num_t=5 t=0.50
num=55.00 num_t=54 t=1.00
num=550.00 num_t=549 t=1.00
num=5500.00 num_t=5499 t=1.00
fnum=0.56
num=5.60 num_t=5 t=0.60
num=56.00 num_t=55 t=1.00
num=560.00 num_t=559 t=1.00
num=5600.00 num_t=5599 t=1.00
fnum=0.57
num=5.70 num_t=5 t=0.70
num=57.00 num_t=56 t=1.00
num=570.00 num_t=569 t=1.00
num=5700.00 num_t=5699 t=1.00
fnum=0.58
num=5.80 num_t=5 t=0.80
num=58.00 num_t=57 t=1.00
num=580.00 num_t=579 t=1.00
num=5800.00 num_t=5799 t=1.00
fnum=0.59
num=5.90 num_t=5 t=0.90
num=59.00 num_t=58 t=1.00
num=590.00 num_t=589 t=1.00
num=5900.00 num_t=5899 t=1.00
fnum=0.60
num=6.00 num_t=5 t=1.00
num=60.00 num_t=59 t=1.00
num=600.00 num_t=599 t=1.00
num=6000.00 num_t=5999 t=1.00
fnum=0.61
num=6.10 num_t=6 t=0.10
num=61.00 num_t=60 t=1.00
num=610.00 num_t=609 t=1.00
num=6100.00 num_t=6099 t=1.00
fnum=0.62
num=6.20 num_t=6 t=0.20
num=62.00 num_t=61 t=1.00
num=620.00 num_t=619 t=1.00
num=6200.00 num_t=6199 t=1.00
fnum=0.63
num=6.30 num_t=6 t=0.30
num=63.00 num_t=62 t=1.00
num=630.00 num_t=629 t=1.00
num=6300.00 num_t=6299 t=1.00
fnum=0.64
num=6.40 num_t=6 t=0.40
num=64.00 num_t=63 t=1.00
num=640.00 num_t=639 t=1.00
num=6400.00 num_t=6399 t=1.00
fnum=0.65
num=6.50 num_t=6 t=0.50
num=65.00 num_t=64 t=1.00
num=650.00 num_t=649 t=1.00
num=6500.00 num_t=6499 t=1.00
fnum=0.66
num=6.60 num_t=6 t=0.60
num=66.00 num_t=65 t=1.00
num=660.00 num_t=659 t=1.00
num=6600.00 num_t=6599 t=1.00
fnum=0.67
num=6.70 num_t=6 t=0.70
num=67.00 num_t=66 t=1.00
num=670.00 num_t=669 t=1.00
num=6700.00 num_t=6699 t=1.00
fnum=0.68
num=6.80 num_t=6 t=0.80
num=68.00 num_t=67 t=1.00
num=680.00 num_t=679 t=1.00
num=6800.00 num_t=6799 t=1.00
fnum=0.69
num=6.90 num_t=6 t=0.90
num=69.00 num_t=68 t=1.00
num=690.00 num_t=689 t=1.00
num=6900.00 num_t=6899 t=1.00
fnum=0.70
num=7.00 num_t=6 t=1.00
num=70.00 num_t=69 t=1.00
num=700.00 num_t=699 t=1.00
num=7000.00 num_t=6999 t=1.00
fnum=0.71
num=7.10 num_t=7 t=0.10
num=71.00 num_t=70 t=1.00
num=710.00 num_t=709 t=1.00
num=7100.00 num_t=7099 t=1.00
fnum=0.72
num=7.20 num_t=7 t=0.20
num=72.00 num_t=71 t=1.00
num=720.00 num_t=719 t=1.00
num=7200.00 num_t=7199 t=1.00
fnum=0.73
num=7.30 num_t=7 t=0.30
num=73.00 num_t=72 t=1.00
num=730.00 num_t=729 t=1.00
num=7300.00 num_t=7299 t=1.00
fnum=0.74
num=7.40 num_t=7 t=0.40
num=74.00 num_t=73 t=1.00
num=740.00 num_t=739 t=1.00
num=7400.00 num_t=7399 t=1.00
fnum=0.75
num=7.50 num_t=7 t=0.50
num=75.00 num_t=74 t=1.00
num=750.00 num_t=749 t=1.00
num=7500.00 num_t=7499 t=1.00
fnum=0.76
num=7.60 num_t=7 t=0.60
num=76.00 num_t=75 t=1.00
num=760.00 num_t=759 t=1.00
num=7600.00 num_t=7599 t=1.00
fnum=0.77
num=7.70 num_t=7 t=0.70
num=77.00 num_t=76 t=1.00
num=770.00 num_t=769 t=1.00
num=7700.00 num_t=7699 t=1.00
fnum=0.78
num=7.80 num_t=7 t=0.80
num=78.00 num_t=77 t=1.00
num=780.00 num_t=779 t=1.00
num=7800.00 num_t=7799 t=1.00
fnum=0.79
num=7.90 num_t=7 t=0.90
num=79.00 num_t=78 t=1.00
num=790.00 num_t=789 t=1.00
num=7900.00 num_t=7899 t=1.00
fnum=0.80
num=8.00 num_t=7 t=1.00
num=80.00 num_t=79 t=1.00
num=800.00 num_t=799 t=1.00
num=8000.00 num_t=7999 t=1.00
fnum=0.81
num=8.10 num_t=8 t=0.10
num=81.00 num_t=80 t=1.00
num=810.00 num_t=809 t=1.00
num=8100.00 num_t=8099 t=1.00
fnum=0.82
num=8.20 num_t=8 t=0.20
num=82.00 num_t=81 t=1.00
num=820.00 num_t=819 t=1.00
num=8200.00 num_t=8199 t=1.00
fnum=0.83
num=8.30 num_t=8 t=0.30
num=83.00 num_t=82 t=1.00
num=830.00 num_t=829 t=1.00
num=8300.00 num_t=8299 t=1.00
fnum=0.84
num=8.40 num_t=8 t=0.40
num=84.00 num_t=83 t=1.00
num=840.00 num_t=839 t=1.00
num=8399.99 num_t=8399 t=0.99
fnum=0.85
num=8.50 num_t=8 t=0.50
num=85.00 num_t=84 t=1.00
num=850.00 num_t=849 t=1.00
num=8500.00 num_t=8499 t=1.00
fnum=0.86
num=8.60 num_t=8 t=0.60
num=86.00 num_t=85 t=1.00
num=860.00 num_t=859 t=1.00
num=8599.99 num_t=8599 t=0.99
fnum=0.87
num=8.70 num_t=8 t=0.70
num=87.00 num_t=86 t=1.00
num=870.00 num_t=869 t=1.00
num=8700.00 num_t=8699 t=1.00
fnum=0.88
num=8.80 num_t=8 t=0.80
num=88.00 num_t=87 t=1.00
num=880.00 num_t=879 t=1.00
num=8799.99 num_t=8799 t=0.99
fnum=0.89
num=8.90 num_t=8 t=0.90
num=89.00 num_t=88 t=1.00
num=890.00 num_t=889 t=1.00
num=8899.99 num_t=8899 t=0.99
fnum=0.90
num=9.00 num_t=8 t=1.00
num=90.00 num_t=89 t=1.00
num=900.00 num_t=899 t=1.00
num=8999.99 num_t=8999 t=0.99
fnum=0.91
num=9.10 num_t=9 t=0.10
num=91.00 num_t=90 t=1.00
num=910.00 num_t=909 t=1.00
num=9099.99 num_t=9099 t=0.99
fnum=0.92
num=9.20 num_t=9 t=0.20
num=92.00 num_t=91 t=1.00
num=920.00 num_t=919 t=1.00
num=9199.99 num_t=9199 t=0.99
fnum=0.93
num=9.30 num_t=9 t=0.30
num=93.00 num_t=92 t=1.00
num=930.00 num_t=929 t=1.00
num=9299.99 num_t=9299 t=0.99
fnum=0.94
num=9.40 num_t=9 t=0.40
num=94.00 num_t=93 t=1.00
num=940.00 num_t=939 t=1.00
num=9399.99 num_t=9399 t=0.99
fnum=0.95
num=9.50 num_t=9 t=0.50
num=95.00 num_t=94 t=1.00
num=950.00 num_t=949 t=1.00
num=9499.99 num_t=9499 t=0.99
fnum=0.96
num=9.60 num_t=9 t=0.60
num=96.00 num_t=95 t=1.00
num=960.00 num_t=959 t=1.00
num=9599.99 num_t=9599 t=0.99
fnum=0.97
num=9.70 num_t=9 t=0.70
num=97.00 num_t=96 t=1.00
num=970.00 num_t=969 t=1.00
num=9699.99 num_t=9699 t=0.99
fnum=0.98
num=9.80 num_t=9 t=0.80
num=98.00 num_t=97 t=1.00
num=980.00 num_t=979 t=1.00
num=9799.99 num_t=9799 t=0.99
fnum=0.99
num=9.90 num_t=9 t=0.90
num=99.00 num_t=98 t=1.00
num=990.00 num_t=989 t=1.00
num=9899.99 num_t=9899 t=0.99
fnum=1.00
num=10.00 num_t=9 t=1.00
num=100.00 num_t=99 t=1.00
num=1000.00 num_t=999 t=1.00
num=9999.99 num_t=9999 t=0.99
fnum=1.01
num=10.10 num_t=10 t=0.10
num=101.00 num_t=100 t=1.00
num=1010.00 num_t=1009 t=1.00
num=10099.99 num_t=10099 t=0.99为了便于分析,我出了一组数据,大家看看!
num=num*10;
num_t=(int)num;
t=t=num-(int)num;

珜羽 发表于 2012-8-11 15:50:08

http://seapalace.blog.sohu.com/1586858.html
看看这个对你有启示不。

绿林网页 发表于 2012-8-11 15:50:22

总结上面的:1~100的数字中
除了 17 ~ 28 这些数字num = (int)num
其它都是 num=(int)num +1

谁能知道原因?

zcbzjx 发表于 2012-8-11 15:57:44

这个问题首先要从浮点数的二进制表示说起,浮点数的小数表示是这样的。比如0.4=(1/2)*0+(1/4)*1+(1/8)*1+(1/16)*0+……实际上这永远算不完!这就是著名的浮点数精度问题。所以直到加上前面的整数部分算够(float 23位,double 52位)就行了。这样0.56表示成二进制的嘶吼就省掉了点。所以乘以100就不是56了,而是55.9。。。。。9了,转换成int,就是55了.

珜羽 发表于 2012-8-11 15:57:46

找到了

参见IEEE 754标准
http://zh.wikipedia.org/wiki/IEEE_754


规约形式的浮点数
如果浮点数中指数部分的编码值在 exponent 之间,且尾数部分最高有效位(即整数字)是1,那么这个浮点数将被称为规约形式的浮点数。
[编辑]非规约形式的浮点数
如果浮点数的指数部分的编码值是0,尾数的最高有效位(即整数字)也是0,那么这个浮点数将被称为非规约形式的浮点数。IEEE 754标准规定:非规约形式的浮点数的指数偏移值比规约形式的浮点数的指数偏移值大1. 例如,最小的规约形式的单精度浮点数的指数部分编码值为1,指数的实际值为-126;而非规约的单精度浮点数的指数域编码值为0,对应的指数实际值也是-126而不是-127。实际上非规约形式的浮点数仍然是有效可以使用的,只是它们的绝对值已经小于所有的规约浮点数的绝对值;即所有的非规约浮点数比规约浮点数更接近0。规约浮点数的尾数大于等于1且小于2,而非规约浮点数的尾数小于1且大于0.

应该就是这个1造成的问题。
页: [1] 2
查看完整版本: 此算式何解