fpc-3.0.0 - запилили баг в арифметику

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Re: fpc-3.0.0 - запилили баг в арифметику

Сообщение pupsik » 17.03.2017 12:50:14

Всё живое на земле - это глюки моего космического корабля...
поехало...
zub зачем вы vitaly_l ссылку дали. Теперь у него "сноски" пошли. :lol:
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: fpc-3.0.0 - запилили баг в арифметику

Сообщение serbod » 17.03.2017 13:09:05

Процессоры Intel всегда считают в extended (80-битном) виде. И правил округления там 5 видов.

Если нужна точная десятичная арифметика, то нужно (необходимо даже) использовать Currency.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: fpc-3.0.0 - запилили баг в арифметику

Сообщение vitaly_l » 17.03.2017 13:14:22

serbod писал(а):Процессоры Intel всегда считают в extended (80-битном) виде. И правил округления там 5 видов.

Если нужна точная десятичная арифметика, то нужно (необходимо даже) использовать Currency.

Ну вот пожалуйста ещё 1 заблуждающийся из 9 миллиардов, и это только ныне живущих

Вот доказательство с предложенным Currency:
Код: Выделить всё
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('<>');
// вернёт ложно =



Q   := 0.4;
QQ := 0.4;
if (Q/QQ)=1 then
  writeln('=')
else
  writeln('<>');
// вернёт ложно =



b   := 4;
bb := 4;

if (b div bb)=1 then
  writeln('=')
else
  writeln('<>');
// вернёт верное =


Q :=(b div bb) / 10;
// вернёт единственно верное решение 0.1, которое явно не равно 1

writestr(s,Q :2:2);
writeln('Q = ' +s);

readln;
end.     


Все слепы, до тех пор пока один не покажет и не разъяснит им истину. Точно также было и с "Земля круглая". "И всё таки она вертится".
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: fpc-3.0.0 - запилили баг в арифметику

Сообщение pupsik » 17.03.2017 13:36:52

vitaly_l она не круглая... Да и по поводу истины - на флуд смахивает ваша истина. Уж сори.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: fpc-3.0.0 - запилили баг в арифметику

Сообщение vitaly_l » 17.03.2017 13:42:47

pupsik писал(а):на флуд смахивает ваша истина

Почему? Ошибка в вычислениях есть? Есть! И эта ошибка, по ссылке которую давал zub - отсутствует. Но там указана, причина. А именно неправильная организация двоичных чисел в памяти, которая при переводе в десятичные числа выдаёт ошибку при 0.1. А я показал, что ещё и при любом делении равных дробей, в математике - возвращается ложное значение. И в компьютере тоже возвращается ложное значение. В частности 0.3 делённое на 0.3 - не равно единице, но компьютер во всех случаях вернёт единицу. И это реальная ошибка во всех расчётах на Земле.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: fpc-3.0.0 - запилили баг в арифметику

Сообщение pupsik » 17.03.2017 13:56:28

Ок...
Тогда скажите, Бог: что в коде ниже не так?
Код: Выделить всё
var
  b, z : Double;

begin
  if 0.2 + 0.1 = 0.3 then
    WriteLn('=')
  else
    WriteLn('<>');

  b := 0.2  + 0.1;
  z := 0.3;
  if b = z then
    WriteLn('b =')
  else
    WriteLn('b <>');

  b := 0.2 + 0.1;
  if b  = 0.3 then
    WriteLn('xz =')
  else
    WriteLn('xz <>');
  ReadLn;
end.       

а потом вернёмся к вашим баранам.
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: fpc-3.0.0 - запилили баг в арифметику

Сообщение vitaly_l » 17.03.2017 14:06:13

pupsik писал(а):Ок...
Тогда скажите, Бог: что в коде ниже не так?
а потом вернёмся к вашим баранам.

Ну почему же, мы сразу к ним вернёмся, только сконцентируйтесь на каждом моём слове, читайте каждое слово внимательно с пониманием:
ИСКЛЮЧИТЕЛЬНО ТОЛЬКО ПРИ ДЕЛЕНИИ РАВНЫХ ДЕСЯТИЧНЫХ ДРОБЕЙ В МАТЕМАТИКЕ И НА КАЛЬКУЛЯТОРАХ И НА КОМПЬЮТЕРАХ ВСЕГДА И ВЕЗДЕ ВО ВСЕХ ОФИСАХ МИРА - возвращается ложное значение равное 1 (единице), а на самом деле при делении 0.3 на 0.3 должно возвращаться 0.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('<>');
// вернёт ложно =



Q   := 0.4;
QQ := 0.4;
if (Q/QQ)=1 then
  writeln('=')
else
  writeln('<>');
// вернёт ложно =



b   := 4;
bb := 4;

if (b div bb)=1 then
  writeln('=')
else
  writeln('<>');
// вернёт верное =


Q :=(b div bb) / 10;
// вернёт единственно верное решение 0.1, которое явно не равно 1

writestr(s,Q :2:2);
writeln('Q = ' +s);

readln;
end.


Исключительно только в четвёртой задаче, компьютер вернёт верное решение (благодаря третьей). Только что мы в очередной раз положили весь Мир на лопатки. Но это ничего не меняет, т.к. гибель планеты увы неизбежна. Постольку поскольку, в реальном мире, на моём космическом корабле под названием БОГ - что-то случилось. И мне ещё никогда не было так страшно выходить из сна. Потому что, скорее всего, мы все на грани гибели.

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: fpc-3.0.0 - запилили баг в арифметику

Сообщение pupsik » 17.03.2017 14:19:06

а на самом деле при делении 0.3 на 0.3 должно возвращаться 0.1. Уловили?
э..э: не понял. Откуда вы остаток берёте? Согласно какой теории?
Для вас одинаково: / и div???

Только что мы в очередной раз положили весь Мир на лопатки.
по мне: только что вы "сели в лужу" и не заметили.

п.с.
Кстати: каков ответ на вопрос:
что в коде ниже не так?


Добавлено спустя 4 минуты 3 секунды:
и что вы этим:
Код: Выделить всё
Q :=(b div bb) / 10
хотите доказать?
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: fpc-3.0.0 - запилили баг в арифметику

Сообщение vitaly_l » 17.03.2017 14:24:41

pupsik писал(а):п.с.
Кстати: каков ответ на вопрос:
что в коде ниже не так?

Вы опять не поняли ни слова из того что я написал. Ещё раз пробуем, читайте каждое слово внимательно с пониманием:
ИСКЛЮЧИТЕЛЬНО ТОЛЬКО ПРИ ДЕЛЕНИИ РАВНЫХ ДЕСЯТИЧНЫХ ДРОБЕЙ В МАТЕМАТИКЕ И НА КАЛЬКУЛЯТОРАХ И НА КОМПЬЮТЕРАХ ВСЕГДА И ВЕЗДЕ ВО ВСЕХ ОФИСАХ МИРА - возвращается ложное значение равное 1 (единице), а на самом деле при делении 0.3 на 0.3 должно возвращаться 0.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.


Добавлено спустя 7 минут 77 секунд:
Я добавил там пятую задачу, в ней доказано, что 0.1 не равно 1 при этом калькуляторы и 1+2 задачи - возвращали ложное значение, т.к. когда вы делите на калькуляторе 0.3 / 0.3, то он возвращает ложно 1. И это во всём мире
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: fpc-3.0.0 - запилили баг в арифметику

Сообщение Лекс Айрин » 17.03.2017 14:53:09

vitaly_l, Welcome to Wonderland!

Не стоит путать арбузы с едоками. Если у меня треть арбуза и я всю ее сожрал, то едоков 1(один), а не моя десятая часть.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: fpc-3.0.0 - запилили баг в арифметику

Сообщение pupsik » 17.03.2017 14:54:33

Ох... и ах...: вырубайте художника. И поясните то что вы хотите доказать. Желательно основываясь на теориях (конечно не своих). А то, есть момент, "своих теорий" одной милой девушки (не с форума, а реальной жизни).

п.с.
Я добавил там пятую задачу
хоть десятую. Ответьте на вопрос
что в коде ниже не так?
... потом продолжим...
Как я понимаю:
Для вас одинаково: / и div???
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: fpc-3.0.0 - запилили баг в арифметику

Сообщение vitaly_l » 17.03.2017 15:01:47

Лекс Айрин писал(а):vitaly_l, Welcome to Wonderland!
Не стоит путать арбузы с едоками. Если у меня треть арбуза и я всю ее сожрал, то едоков 1(один), а не моя десятая часть.

pupsik писал(а):Для вас одинаково: / и div???

Div вместо / там сделано, потому что, делится 4-ре byte на 4-ре byte. (не дробное число, которое всегда вернёт 1)

Но Вы опять не поняли ни слова из того что я написал. Ещё раз пробуем, читайте каждое слово внимательно с пониманием:
ИСКЛЮЧИТЕЛЬНО ТОЛЬКО ПРИ ДЕЛЕНИИ РАВНЫХ ДЕСЯТИЧНЫХ ДРОБЕЙ В МАТЕМАТИКЕ И НА КАЛЬКУЛЯТОРАХ И НА КОМПЬЮТЕРАХ ВСЕГДА И ВЕЗДЕ ВО ВСЕХ ОФИСАХ МИРА - возвращается ложное значение равное 1 (единице), а на самом деле при делении 0.3 на 0.3 должно возвращаться 0.1. Уловили? Нет? Тогда при делении 0.05 / на 0.05 должно вернуться 0.01, а не 1. Понимаете или всё ещё нет? Нет? Тогда при делении 0.777 на 0.777 должно вернуться 0.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 ? Потом проверьте, что вернёт ваш калькулятор. И убедитесь, что весь мир заблуждается.
Последний раз редактировалось vitaly_l 17.03.2017 15:07:59, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: fpc-3.0.0 - запилили баг в арифметику

Сообщение Лекс Айрин » 17.03.2017 15:07:32

Не, я столько травы не сожру)))) так что подобное мне понять трудно.

vitaly_l писал(а): т.к. когда вы делите на калькуляторе 0.3 / 0.3, то он возвращает ложно 1.


Мой абак тоже возвращает 1. И счеты... такие, деревянные перекладные.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: fpc-3.0.0 - запилили баг в арифметику

Сообщение vitaly_l » 17.03.2017 15:09:21

Лекс Айрин писал(а):Мой абак тоже возвращает 1. И счеты... такие, деревянные перекладные.

Ну так это и есть ошибка всего Мира! Теперь понятно? Я же ясно написал, что весь Мир лежит на лопатках :wink: .

Добавлено спустя 2 минуты 22 секунды:
Попытайся понять, посмотрите код, прочитайте каждое слово внимательно с пониманием, что и зачем я делаю? Вот задача:
ИСКЛЮЧИТЕЛЬНО ТОЛЬКО ПРИ ДЕЛЕНИИ РАВНЫХ ДЕСЯТИЧНЫХ ДРОБЕЙ В МАТЕМАТИКЕ И НА КАЛЬКУЛЯТОРАХ И НА КОМПЬЮТЕРАХ ВСЕГДА И ВЕЗДЕ ВО ВСЕХ ОФИСАХ МИРА - возвращается ложное значение равное 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 ? Потом проверьте, что вернёт ваш калькулятор. И убедитесь, что весь мир заблуждается.
Последний раз редактировалось vitaly_l 17.03.2017 15:14:43, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: fpc-3.0.0 - запилили баг в арифметику

Сообщение Лекс Айрин » 17.03.2017 15:12:43

vitaly_l писал(а):Ну так это и есть ошибка всего Мира!


Опасное мнение. Мир сущность мстительная.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Пред.След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18

Рейтинг@Mail.ru