Куча говна / Говнокод #11979 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 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;

ideone.com/pXIhvY
Безопасный военный язык, да.

Запостил: 3.14159265 3.14159265, (Updated )

Комментарии (42) RSS

    • Просто от Ады, честно говоря, я ожидал другого, и уже обрадовался когда нули вылезли при первом тесте.
      Думал строгая типизация как-то запретит подобную херь.

      А это получается предательское крестофлоатство.
      Ответить
        • Ну хоть ворнинг можно. Вон даже сраная жаба ругается на потерю точности когда пишешь float f=26.0.
          Ответить
          • Литерал не имеет типа. Он может неявно преобразовываться к целому семейству типов. Я не могу придумать случай, где это что-то портит.
            Например, тут, как видно, дело не в типах, а в особенностях компьютерной арифметики.
            Ответить
            • >Он может неявно преобразовываться к целому семейству типов.
              >Я не могу придумать случай, где это что-то портит.
              Неявно! Ну допустим ты написал
              Float f:=3.141592653589793;
              А оно неявно обрезало младшие биты. И в итоге у тебя получается 3.14159 - и это без предупрежедния.
              В играх-то может и ничего не испортит.
              Ответить
              • Во-первых, f:Float:=3.141592653589793;
                Во-вторых, ну есть небольшая неприятность, но это несерьёзно. Выбирая такое неточное говно, как Float, ты уже подписываешься на то, что тебе пофиг точность.
                Ответить
              • > А оно неявно обрезало младшие биты.
                Тогда этот ворнинг надо выдавать всегда.

                Я написал 0.3, а оно отрезало бесконечно много младших бит, и превратило мое прекрасное 0.3 в сраное говно 0.2999999999999. И это без предупреждения...
                Ответить
                • >Я написал 0.3
                  Это можно представить в памяти как угодно в виде дроби, например - 3/10. Язык высокого уровня ведь должен абстрагировать нас от этого.
                  А когда переходим к дискретному представлению - тут то и происходит потеря данных.
                  Это как векторное изображение и растр.
                  Ответить
                  • Да я и говорю, сразу на уровне символов, как в человеческом мозгу. У нас же нет в голове никакого 3.1415ляляля, у нас есть некоторое pi, которое в формуле можно сокращаться с другим pi, ещё можно x сокращать с sinx и pi*pi сокращать с 10 или с g - это нас так на физике учили выводить формулы.
                    Только эта фигня с символами всё равно сосёт, потому что см. пример с кубическим уравнением ниже.
                    Ответить
                    • Прежде чем вводить формулу в компилятор - ты должен её максимально упростить. В том числе и символьно сократить. Ты же не заставляешь свой компилятор во время компиляции решать символьно уравнения? А сам их решишь, а потом максимально упростишь.
                      Ответить
  • Фокусник, однако. image округляет, а кто в сравнении округлять будет? Где здесь говно?
    [summon]В Аде есть Fixed или Rational?[/summon]
    Ответить
  • А что должен сделать язык, даже военный и безопасный?
    Сам штоле вместо a<=b подрисовывать a<=b+eps?
    Я думал, про то, как надо сравнивать вещественные, на информатике рассказывают.
    Ответить
    • Безопасный язык должен по дефолту работать с длинной арифметикой.
      Ответить
      • Да сразу с символьной алгеброй. Без неё всё равно не получится сделать так, чтобы sqrt(2)*sqrt(2) равнялось двум.
        Ответить
        • Кстати, про символьную алгебру. Она тоже сосёт. Если взять x^3+3x-4, то очевидно, что у него есть корень 1. Но формула Кадрано даёт
          (2+sqrt(5))^(1/3) + (2-sqrt(5))^(1/3), и сию хреноту никакими символьными преобразованиями превратить в единицу нельзя.
          Ответить
          • > про символьную алгебру. Она тоже сосёт.

            Всегда можно сначала попробовать поискать перебором рациональные корни через "теорему о рациональных корнях", а не по-тупому кардано запускать
            Ответить
          • А если умножить на a2-ab+b2 ? Надо будет попробовать - ох, давненько не брал в руки сумму кубов.
            Ответить
          • Можно. То ты плохо алгебру знаешь.
            Я понимаю что это вброс (но уверен что пример взят тобой не из потолка и был где-то подсмотрен),
            Потому интуиция подсказывает что это решаемо и потрачу 10 минут своей жизни.

            Ты внимательно смотришь?

            qubr(2+sqr(5))+qubr(2-sqr(5)) =qubr(2+sqr(5))*a1/a1+qubr(2-sqr(5))*a2/a2

            Где 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))
            =qubr( (2+sqr(5))^3 ) / a1+ qubr( (2-sqr(5))^3 ) /a2
            =( (2+sqr(5))*a2+(2+sqr(5))*a1)/(a1*a2)


            a1*a2=qubr(
            	(2-sqr(5))^2*(2+sqr(5))^2=(4-5)^2=1
            )=1
            Ответить
            • >(2+sqr(5))*a1
              (2-sqr(5))*a1
              fix
              b1= (2+sqr(5)); b2=(2-sqr(5));
              ( (2+sqr(5))*a2+(2-sqr(5))*a1)/(a1*a2)=( (2+sqr(5))*a2+(2-sqr(5))*a1)=b1*a2+b2*a1

              PS> Не торопитесь меня плюсовать. Тут возможен Усрус вариант
              Ответить
              • a1=qubr(4+2*2*sqr(5)+5) *sqr(5))/qubr(sqrt(5))=
                qubr(
                4*sqrt(5)+4*5+sqrt(5)^3=sqrt(5)^3+3*sqrt(5)+3*5+1+1
                )/qubr(sqrt(5))
                =qubr(
                (sqr(5)+1)^3+1
                )/qubr(sqrt(5))
                Ответить
              • a2=qubr(4-2*2*sqr(5)+5) *sqr(5))/qubr(sqrt(5))=
                qubr(
                     4*sqrt(5)-4*5+sqrt(5)^3=sqrt(5)^3-3*5+3*sqrt(5)+1+1
                )/qubr(sqrt(5))
                =qubr(
                    (sqr(5)-1)^3+1
                )/qubr(sqrt(5))
                Ответить
              • b1=2+sqr(5)=(16+8*sqr(5))/8=(5*sqr(5) + 3*5 + 3*sqr(5) + 1)/8=
                (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
                Ответить
                • >a1=(sqr(5)+1)/2;a2=(1-sqr(5))/2
                  Снова ошибка. Забыт квадрат.
                  a1=((sqr(5)+1)/2)^2=(5+sqrt(5)+1)/4=6/4+sqrt(5)/4
                  a2=((1-sqr(5))/2)^2=(5-sqrt(5)+1)/4=6/4-sqrt(5)/4
                  
                  
                  b1*a2+b2*a1=(2+sqr(5)) * (6-sqr(5))/4+(2-sqr(5)) * (6+sqr(5))/4
                  =(
                    ( 2*6-2*sqr(5)+6*sqr(5)  - 5 ) + 6*2 + 2*sqr(5)/2  -6*sqr(5) - 5
                  )/4=   (12 - 5     + 6*2   -5)= (24-20)/4=1
                  Q.E.D
                  Конечно зря я повелся думал 10 минут, а проебал час.
                  Потерял я сноровку - задача реально на 20 минут.
                  Ответить
                  • Лень смотреть, где это ты так просто посеял кубокорни.
                    Ответить
                    • Кратко суть: там всё сводится к золотому сечению, и как я сразу до этого не догадался увидев sqrt(5)?
                      Можно было представить моё решение и попроще, но это ж был процесс.

                      И да - на бумаге решать такие вещи - гораздо удобнее.
                      Ответить
                      • Ах ты ж блин, ты 16+8*sqrt(5) разложил...
                        Да, признаю, это правда.
                        Ответить
            • > То ты плохо алгебру знаешь.

              Дорогой мой, я закончил отделение чистмата факультета Мат-Мех СПбГУ, а пример с выражением, которое никак не преобразовать, я взял из книжки "Математическая энциклопедия для школьников" серии Аванта+.
              Ответить
          • Проблема тут в другом, кубический корень имеет 3 значения, а потому там кроме 1 будут еще 2 мнимых.
            Ответить
            • Да при чём тут это? Берём обычное определение квадратного и кубического корня, которые для вещественных. Выражение сие, если его посчитать на калькуляторе, равно 1 довольно точно. А преобразовать нельзя.
              Ответить

Добавить комментарий

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8