fpc-3.0.0 - запилили баг в арифметику
Модератор: Модераторы
Лекс Айрин у vitaly_l попросите травки-муравки... у него она качественная..
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
pupsik, не... я с Мирозданием договорился -- я не употребляю травку (и прочие средства альтернативного восприятия), а оно закрывает для меня Бездну. Мне, конечно, Бездна не страшна, но не стоит искушать судьбу.
Лекс Айрин писал(а):Опасное мнение. Мир сущность мстительная.
Я знаю. Мошенники сжигают и убивают учёных. А потом весь мир гордится убитыми учёными и ставит им памятники.
pupsik писал(а):попросите травки-муравки... у него она качественная
Вы опять не поняли суть. Жаль.
Но попытайтесь хоть в этот раз сконцентрироваться на задаче и понять суть. Посмотрите код, прочитайте каждое слово внимательно с пониманием, что и зачем я делаю? Вот задача: ИСКЛЮЧИТЕЛЬНО ТОЛЬКО ПРИ ДЕЛЕНИИ РАВНЫХ ДЕСЯТИЧНЫХ ДРОБЕЙ В МАТЕМАТИКЕ И НА КАЛЬКУЛЯТОРАХ И НА КОМПЬЮТЕРАХ ВСЕГДА И ВЕЗДЕ ВО ВСЕХ ОФИСАХ МИРА - возвращается ложное значение равное 1 (единице), а на самом деле при делении 0.3 на 0.3 должно возвращаться 0.1. Уловили? Нет? Тогда при делении 0.05 / на 0.05 должно вернуться 0.01, а не 1. Понимаете или всё ещё нет? Нет? Тогда при делении 0.777 на 0.777 должно вернуться 0.001, а не 1. А при делении 888.888 / 888.888 должно вернуться 1.001, а не 1. Соответственно весь мир заблуждается и ошибочно делает расчёты. Понимаете или всё ещё нет? Теперь проверяйте на своём калькуляторе и вот ещё вам код в догонку:
Код: Выделить всё
var
s:string;
Q: Currency;
QQ: Currency;
b:byte;
bb:byte;
begin
Q := 0.7-0.3;
QQ := 0.5-0.1;
if (Q/QQ)=1 then
writeln('=')
else
writeln('<>');
// вернёт ложно = 1
Q := 0.4;
QQ := 0.4;
if (Q/QQ)=1 then
writeln('=')
else
writeln('<>');
// вернёт ложно = 1
b := 4;
bb := 4;
if (b div bb)=1 then
writeln('=')
else
writeln('<>');
// вернёт верное 1 = 1
Q :=(b div bb) / 10;
// вернёт единственно верное решение 0.1, которое явно не равно 1
// пятая задача
if Q =1 then
writeln('=')
else
writeln('<>');
// вернёт верное 0.1 <> 1
writestr(s,Q :2:2);
writeln('Q = ' +s);
readln;
end.
Я добавил там пятую задачу, в ней доказано, что 0.1 не равно 1 при этом калькуляторы и 1+2 задачи - возвращали ложное значение, т.к. когда вы делите на калькуляторе 0.3 / 0.3, то он возвращает ложно 1. И это во всём мире. Скомпилируйте код и постарайтесь, умом, понять почему верным является только решения 3, 4 и 5 ? Потом проверьте, что вернёт ваш калькулятор. И убедитесь, что весь мир заблуждается.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
vitaly_l писал(а): Мошенники сжигают и убивают учёных. А потом весь мир гордится убитыми учёными и ставит им памятники.
Вообще-то, Мир САМ убивает.
То что вас "прёт" - уловил.
То что у вас опять включился "режим художника" - уловил.
То что 1 - это отдельный разговор. И, можно сказать, специальный оператор (как и 0, как и много чего ещё) - то же уловил.
То что вы не можете подтвердить это теорией и доказать (основываясь, возможно на ошибочном мнении, учёных... желательно на формулах и теориях) - то же уловил.
То что вы пропускали уроки - то же уловил.
Хватит о "уловил"... Ответьте, пожалуйста, на вопрос: "что в коде не так"... Код выложен ранее. Потом можно продолжить.
То что у вас опять включился "режим художника" - уловил.
То что 1 - это отдельный разговор. И, можно сказать, специальный оператор (как и 0, как и много чего ещё) - то же уловил.
То что вы не можете подтвердить это теорией и доказать (основываясь, возможно на ошибочном мнении, учёных... желательно на формулах и теориях) - то же уловил.
То что вы пропускали уроки - то же уловил.
Хватит о "уловил"... Ответьте, пожалуйста, на вопрос: "что в коде не так"... Код выложен ранее. Потом можно продолжить.
- serbod
- постоялец
- Сообщения: 449
- Зарегистрирован: 16.09.2016 10:03:02
- Откуда: Минск
- Контактная информация:
vitaly_l писал(а):ИСКЛЮЧИТЕЛЬНО ТОЛЬКО ПРИ ДЕЛЕНИИ РАВНЫХ ДЕСЯТИЧНЫХ ДРОБЕЙ В МАТЕМАТИКЕ И НА КАЛЬКУЛЯТОРАХ И НА КОМПЬЮТЕРАХ ВСЕГДА И ВЕЗДЕ ВО ВСЕХ ОФИСАХ МИРА
Учебник математики с вами не согласен. А ему я доверяю больше, чем вам.
http://www.for6cl.uznateshe.ru/delenie- ... nuyu-drob/
serbod писал(а):Учебник математики с вами не согласен. А ему я доверяю больше, чем вам.
http://www.for6cl.uznateshe.ru/delenie- ... nuyu-drob/
Возьмите любой калькулятор и посчитайте деление 0.777 на 0.777 сколько вернёт? Единицу 1 или 0.001 ?
Далее более понятное решение, только вдумайтесь, а не спорьте ради спора.
pupsik писал(а):То что вы не можете подтвердить это теорией и доказать (основываясь, возможно на ошибочном мнении, учёных... желательно на формулах и теориях) - то же уловил.
Вот более понятное решение с комментариями
Код: Выделить всё
var
s:string;
Q: Currency;
i,ii,m : Extended;
begin
// предположим нужно поделить 0.777 / 0.777
m := 1000; // равно 1000 потому что, имеем дело с 1000-ными десятичными дробями.
i := 0.777 * m; // это первое 0.777 умноженное на 1000 итого i будет = 777
ii := 0.777 * m; // это второе 0.777 умноженное на 1000 итого ii будет = 777
if (i / ii)=1
then writeln('1 = 1')
else writeln('<>');
// вернёт верное 1 = 1 ошибки нет, т.к. 777 число не дробное и при делении 777 на 777 будет естественно 1
Q :=(i / ii) / m; // делим (i / ii), которое всегда вернёт 1, на 1000 т.к. имеем дело с тысячными десятичными дробями
// вернёт единственно верное решение 0.001, которое явно не равно 1,
// а если вы на калькуляторе посчитаете 0.777 / 0.777, то вернёт ложное значение 1.
// и в классической математике тоже ложно вернёт 1, и это ошибка всего Мира.
writestr(s,Q :12:12);
writeln('Q = ' +s);
readln;
end.
vitaly_l
1. Не вижу ответа на мой вопрос.
2. Не вижу теоретического обоснование вашего хм.. пардон: теории.
1. Не вижу ответа на мой вопрос.
2. Не вижу теоретического обоснование вашего хм.. пардон: теории.
zub писал(а):ТС, ты еще не пересмотрел мнение где баг, а где он пофикшен?
Конечно пересмотрел - у меня третий вариант:))) Фиксить double в 3.0.0 было лучше в сторону дальнейшего исправления содержимого памяти переменной при операциях - раз там без багов такая информация не хранится, то не всё ли равно, где будет мелкая неточность: в самой переменной или при исправлении
pupsik писал(а):1. Не вижу ответа на мой вопрос.
Вот ответ на ваш вопрос, его сделал zub ещё на первой странице: http://www.delphikingdom.com/asp/viewit%20...%20alogid=374
pupsik писал(а):Не вижу теоретического обоснование вашего хм.. пардон: теории.
Это не теория это реальная математика. Найдёте ошибку в следующем коде, при расчёте деления 0.777 на 0.777 ?
Код: Выделить всё
var
s:string;
Q: Currency;
i,ii,m : Extended;
begin
m := 1000;
i := 0.777 * m;
ii := 0.777 * m;
Q :=(i / ii) / m;
writestr(s,Q :12:12);
writeln('Q = ' +s);
readln;
end.
Мой код вернёт 0.001. А любой калькулятор вернёт 1 (единицу). А теперь сделайте плавный график, по функции, в теле которого будет 0.01 делиться на 0.01, и если использовать мой метод, то скачка не будет. А если использовать метод заложенный в калькулятор, то в момент равных дробей - будет скачёк до 1 (единицы). И самолёт входит в штопор и падает, ракета взрывается
Добавлено спустя 10 минут 36 секунд:
Ну или например из-за этой ошибки, все атомные станции на планете, выходят одновременно из строя, т.к. подаётся вместо 0.0001 напряжение равное 1 и тогда... Чернобыльская и Фокусимская аварии - покажутся раем, т.к. на Земле не будет ни одного клочка без радиации. А всё почему? Да потому что бородатый Пупсик, не умеет правильно делить 0.00001 на 0.00001 <== сколько это буде на Вашем калькуляторе??? Посчитайте! 1?!
А теперь посчитайте просто поделив в коде. И там и там буде 1 (единица)? Вникаешь бородатый флудер Пупсик, какая фишка страшная? Знаешь сколько на земле атомных станций? А управляет ими что? И у всех априори ложное решение равное 1...
Последний раз редактировалось vitaly_l 17.03.2017 16:22:48, всего редактировалось 1 раз.
vitaly_l бло...о... А теперь от обратного: делаем проверку. Т.е. результат деления * на делитель = делимое.
Ваш бурбулятор ещё не сломался? Т.е.: что у вас получится: 0.777 * 0.001 неужто 0.777
Или травка-муравка не закончилась и система будет сломана?
Вполне возможно вы напишете что проверка не верна. И надо по другому. Вот это "иное" мне интересно. Как там ваша божественность будет выкручиваться
Добавлено спустя 1 минуту 54 секунды:

Добавлено спустя 1 минуту 50 секунд:
Ваш бурбулятор ещё не сломался? Т.е.: что у вас получится: 0.777 * 0.001 неужто 0.777
Вполне возможно вы напишете что проверка не верна. И надо по другому. Вот это "иное" мне интересно. Как там ваша божественность будет выкручиваться
Добавлено спустя 1 минуту 54 секунды:
я около одной живу. Пока ниче так... А вот троль из вас знатныйЗнаешь сколько на земле атомных станций?
Добавлено спустя 1 минуту 50 секунд:
оп... не заметил... Как и вы не смотрели код.. Мил человек, там в другом загвоздка.Вот ответ на ваш вопрос, его сделал zub...
vitaly_l писал(а):Мой код вернёт 0.001. А любой калькулятор вернёт 1 (единицу). А теперь сделайте плавный график, по функции, в теле которого будет 0.01 делиться на 0.01, и если использовать мой метод, то скачка не будет. А если использовать метод заложенный в калькулятор, то в момент равных дробей - будет скачёк до 1 (единицы). И самолёт входит в штопор и падает, ракета взрывается . Потому что ошибка заложена в калькуляторы всего мира. Проверьте на своём калькуляторе и убедитесь уже!!!
Прикол в том, что мы считаем цифры обычно для реального мира, а в нём математическая реальность вторична. Чтобы формулы которыми пользуются физики сошлись, огромное количество мелких частиц перестукиваются как детали арифмометра Феликса и решают куда ещё движущихся частиц подбросить чтобы и формулы сошлись и физиковский "закон сохранения энергии" не нарушился. Поэтому 0.1/0.1=1 просто потому что так надо для целостности математики. Ну а неточности в такой организованной мелкими частицами конструкции конечно есть.
если не ошибаюсь - попытка связать Currency с Extended. В принципе могут быть слоно-жирафы.. но чёт я их не встречал.Найдёте ошибку в следующем коде
Сквозняк да не поймёт он что 1 - не только цифра...
pupsik писал(а):vitaly_l бло...о... А теперь от обратного: делаем проверку. Т.е. результат деления * на делитель = делимое.
Ваш бурбулятор ещё не сломался? Т.е.: что у вас получится: 0.777 * 0.001 неужто 0.777 Или травка-муравка не закончилась и система будет сломана?
Вполне возможно вы напишете что проверка не верна. И надо по другому. Вот это "иное" мне интересно. Как там ваша божественность будет выкручиваться
Это правильная проверка. При обратной проверке - результат будет неправильный. Значит, при делении дробных чисел действуют друге правила. 0.25 делённое на 0.25 - не должно возвращать 1, п равно и число, которое больше себя, т.к. сами по себе оба: делимое и делитель - меньше единицы. Грубо говоря, 0.25 делится на что-то и вдруг 0.25 вырастает до 1...
vitaly_l писал(а):Ну или например из-за этой ошибки, все атомные станции на планете, выходят одновременно из строя, т.к. подаётся вместо 0.0001 напряжение равное 1 и тогда... Чернобыльская и Фокусимская аварии - покажутся раем, т.к. на Земле не будет ни одного клочка без радиации. А всё почему?
Прям начало какой нибудь пост апокалиптической научной фантастики
