читаем документацию, ищем для себя N десятков маленьких, но интересных полупрактических задачек для тренировки (в этом лично мне очень помогает diofant.ru).
И во время решения одной такой задачки натолкнулся на необъяснимую для меня странность, в написанном алгоритме отделения от числа единиц. То есть число, например, 56 должен представить как 5 и 6; 1268 как 126 и 8 и т.д и т.п.:
Однако оказалось если двухзначное число записано из двух цифр n и n+1 в ответ выдается n, причем во всех остальных случаях все работает без накладок.
Собственно код дающий ошибку:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import math;
y = 12;
z, Buffer = math.modf(y / 10.0);
print z;
z = z * 10;
print z;
z = int(z);
print(z);
Для y = 34 - 3.
В случае же если число не указанного вида (n и n+1) ответ будет соответствовать действительности.
Видно что ошибка возникает после z = int(z). Использование math.trunc проблем не решает.
Что удивительно такой код работает правильно:
x = 2.0;
x = int(2.0);
print x;
То же самое в run time^\:
lexa@linux-lexa:~> python
Python 2.6 (r26:66714, Dec 3 2008, 10:55:18)
[GCC 4.3.2 [gcc-4_3-branch revision 141291]] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import math
>>> y=12
>>> z, Buffer = math.modf(y / 10.0)
>>> print z
0.2
>>> z = z * 10
>>> print z
2.0
>>> z = int(z)
>>> print z
1
program buben ;
uses crt;
var y : integer;
z : real;
BEGIN
y := 12;
z := frac(y / 10);
writeln(z);
z := z * 10;
writeln(z);
y:=trunc(z);
writeln(y);
END.
2.00000000000000E-001
2.00000000000000E+000
2
Уже весь мозг над проблемой сломал, может кто нибудь объяснить в чем дело?
Как оказалось все сложнее, и ошибка приходится не на все и не только на числа приведенного мной вида, написал для проверки:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import math;
print "Введено Получено Должно.0";
for y in range(11, 100):
z, Buffer = math.modf(y / 10.0);
z = z * 10;
a = z;
z = int(z);
print str(y) + " ...... " + str(z) + " ...... " + str(a);
Введено Получено Должно.0
12 …… 1 …… 2.0
14 …… 3 …… 4.0
23 …… 2 …… 3.0
24 …… 3 …… 4.0
28 …… 7 …… 8.0
33 …… 2 …… 3.0
34 …… 3 …… 4.0
38 …… 7 …… 8.0
41 …… 0 …… 1.0
43 …… 2 …… 3.0
46 …… 5 …… 6.0
48 …… 7 …… 8.0
51 …… 0 …… 1.0
53 …… 2 …… 3.0
56 …… 5 …… 6.0
58 …… 7 …… 8.0
61 …… 0 …… 1.0
63 …… 2 …… 3.0
66 …… 5 …… 6.0
68 …… 7 …… 8.0
71 …… 0 …… 1.0
73 …… 2 …… 3.0
76 …… 5 …… 6.0
78 …… 7 …… 8.0
81 …… 0 …… 1.0
82 …… 1 …… 2.0
86 …… 5 …… 6.0
87 …… 6 …… 7.0
91 …… 0 …… 1.0
92 …… 1 …… 2.0
96 …… 5 …… 6.0
97 …… 6 …… 7.0