- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
with Ada.Integer_Text_Io, Ada.Text_Io;
use Ada.Integer_Text_Io, Ada.Text_Io;
procedure Test is
v : Long_Float := 26.0;
v1 : float := 26.0;
begin
while (v<27.0) loop
Put_Line("Value = " & Long_Float'image(v));
v:=v+0.2;
end loop;
while (v1<27.0) loop
Put_Line("Value = " & float'image(v1));
v1:=v1+0.2;
end loop;
end;
Думал строгая типизация как-то запретит подобную херь.
А это получается предательское крестофлоатство.
Например, тут, как видно, дело не в типах, а в особенностях компьютерной арифметики.
>Я не могу придумать случай, где это что-то портит.
Неявно! Ну допустим ты написал
Float f:=3.141592653589793;
А оно неявно обрезало младшие биты. И в итоге у тебя получается 3.14159 - и это без предупрежедния.
В играх-то может и ничего не испортит.
Во-вторых, ну есть небольшая неприятность, но это несерьёзно. Выбирая такое неточное говно, как Float, ты уже подписываешься на то, что тебе пофиг точность.
Тогда этот ворнинг надо выдавать всегда.
Я написал 0.3, а оно отрезало бесконечно много младших бит, и превратило мое прекрасное 0.3 в сраное говно 0.2999999999999. И это без предупреждения...
Это можно представить в памяти как угодно в виде дроби, например - 3/10. Язык высокого уровня ведь должен абстрагировать нас от этого.
А когда переходим к дискретному представлению - тут то и происходит потеря данных.
Это как векторное изображение и растр.
С этим все ок: http://ideone.com/cuXp8S.
Только эта фигня с символами всё равно сосёт, потому что см. пример с кубическим уравнением ниже.
[summon]В Аде есть Fixed или Rational?[/summon]
[summon=Taras]
Сам штоле вместо a<=b подрисовывать a<=b+eps?
Я думал, про то, как надо сравнивать вещественные, на информатике рассказывают.
(2+sqrt(5))^(1/3) + (2-sqrt(5))^(1/3), и сию хреноту никакими символьными преобразованиями превратить в единицу нельзя.
Всегда можно сначала попробовать поискать перебором рациональные корни через "теорему о рациональных корнях", а не по-тупому кардано запускать
Я понимаю что это вброс (но уверен что пример взят тобой не из потолка и был где-то подсмотрен),
Потому интуиция подсказывает что это решаемо и потрачу 10 минут своей жизни.
Ты внимательно смотришь?
Где a1=qubr(2+sqr(5)^2)=qubr(4+2*2*sqr(5)+5) ), a2==qubr(2-sqr(5)^2)=qubr(4-2*2*sqr(5)+5))
(2-sqr(5))*a1
fix
b1= (2+sqr(5)); b2=(2-sqr(5));
PS> Не торопитесь меня плюсовать. Тут возможен Усрус вариант
(sqr(5)+1)^3/8
b2=2-sqr(5)=(16-8*sqr(5))/8=(-5*sqr(5) + 3*5 + -3*sqr(5) + 1)/8=
(1-sqr(5))^3/8.
a1= ( cubr(b1) )^2; a2= ( cubr(b2) )^2;
a1=(sqr(5)+1)/2;a2=(1-sqr(5))/2
Снова ошибка. Забыт квадрат.
Конечно зря я повелся думал 10 минут, а проебал час.
Потерял я сноровку - задача реально на 20 минут.
Можно было представить моё решение и попроще, но это ж был процесс.
И да - на бумаге решать такие вещи - гораздо удобнее.
Да, признаю, это правда.
Дорогой мой, я закончил отделение чистмата факультета Мат-Мех СПбГУ, а пример с выражением, которое никак не преобразовать, я взял из книжки "Математическая энциклопедия для школьников" серии Аванта+.