1. Куча / Говнокод #11979

    +175

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 23 Октября 2012

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

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

        А это получается предательское крестофлоатство.
        Ответить
        • Типизация ни при чём.
          Ответить
          • Ну хоть ворнинг можно. Вон даже сраная жаба ругается на потерю точности когда пишешь 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. Язык высокого уровня ведь должен абстрагировать нас от этого.
                    А когда переходим к дискретному представлению - тут то и происходит потеря данных.
                    Это как векторное изображение и растр.
                    Ответить
                    • > Язык высокого уровня ведь должен абстрагировать нас от этого.
                      С этим все ок: http://ideone.com/cuXp8S.
                      Ответить
                    • Да я и говорю, сразу на уровне символов, как в человеческом мозгу. У нас же нет в голове никакого 3.1415ляляля, у нас есть некоторое pi, которое в формуле можно сокращаться с другим pi, ещё можно x сокращать с sinx и pi*pi сокращать с 10 или с g - это нас так на физике учили выводить формулы.
                      Только эта фигня с символами всё равно сосёт, потому что см. пример с кубическим уравнением ниже.
                      Ответить
                      • Прежде чем вводить формулу в компилятор - ты должен её максимально упростить. В том числе и символьно сократить. Ты же не заставляешь свой компилятор во время компиляции решать символьно уравнения? А сам их решишь, а потом максимально упростишь.
                        Ответить
    • Фокусник, однако. image округляет, а кто в сравнении округлять будет? Где здесь говно?
      [summon]В Аде есть Fixed или Rational?[/summon]
      Ответить
      • Не правильно:
        [summon=Taras]
        Ответить
      • В Аде есть вшитый прямо в язык Fixed, работать с которым удобнее, чем с крестовым.
        Ответить
    • эти неуловимые плавающие
      Ответить
    • А что должен сделать язык, даже военный и безопасный?
      Сам штоле вместо 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) разложил...
                          Да, признаю, это правда.
                          Ответить
              • так что там дальше с числителем?
                Ответить
              • > То ты плохо алгебру знаешь.

                Дорогой мой, я закончил отделение чистмата факультета Мат-Мех СПбГУ, а пример с выражением, которое никак не преобразовать, я взял из книжки "Математическая энциклопедия для школьников" серии Аванта+.
                Ответить
            • > про символьную алгебру. Она тоже сосёт
              http://www.wolframalpha.com/input/?i=+x%5E3%2B3x-4
              видишь, железки давно уже умеют точно считать :)
              Ответить
            • Проблема тут в другом, кубический корень имеет 3 значения, а потому там кроме 1 будут еще 2 мнимых.
              Ответить
              • Да при чём тут это? Берём обычное определение квадратного и кубического корня, которые для вещественных. Выражение сие, если его посчитать на калькуляторе, равно 1 довольно точно. А преобразовать нельзя.
                Ответить

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