Во многих источниках тип double и float, числа с плавающей запятой/точкой зачем-то называют вещественными. Такое чувство что кто-то когда-то совершил ошибку или не внимательно написал эту глупость и все как один начали её повторять, совершенно не задумываясь о чём они говорят.

Ладно это были бы просто троечники студенты и любители, так эту ошибку говорят и те, кто обучают специалистов. И эта проблема терминологии не одного ЯП, их правда много (Java, C++, C#, Python, JS и т.д.) везде, где бы я не искал, всегда находятся статьи, ответы, лекции, где дробные числа называют вещественными!

Вот ОЧЕНЬ МАЛЕНЬКАЯ выборка:

Начнём с простого, что такое вещественное число коим называют double и float. Будет немного формул, но не пугайтесь, прочитайте пожалуйста до конца, они очень простые, к каждой я даю интуитивное объяснение.

Вещественное число

Определение можете прочитать в Википедии или дочитать до конца мою статью, где я простым языком скажу или вы сами поймёте, но нужно проследить за мыслью, которую я хочу донести до вас. Я напишу формулой из теории множеств:

R = Q ∪ I

Где, R - множество вещественных чисел;

Q - множество рациональных чисел;

I - множество иррациональных чисел.

Так же Q ⊂ R и I ⊂ R.

Расшифровка тем, кто не очень с теорией множеств. Вещественные числа эта числа которые включают в себя Рациональные и Иррациональные числа (R = Q ∪ I), т.к. Вещественные числа включают их в себя, то Рациональные числа и Иррациональные числа являются подмножеством множества Вещественных (Q ⊂ R и I ⊂ R), причём строго, то есть Q != R и I != R, это очевидная мысль, но её требуется подчеркнуть.

Теперь к самому интересному, какие числа называются Рациональными и Иррациональными (представляю себя преподавателем начальных курсов технических вузов).

Рациональные

Начнём с Рациональных, возьмём определение из википедии.

Рациональное число (от лат. ratio «отношение, деление, дробь») — число, которое можно представить в виде обыкновенной дроби m/n, где m — целое число, а n — натуральное.

Так же стоит отметить, что Рациональные включают в себя Целые и Натуральные числа (-1, 0, 1, 2 ...) их можно выразить в виде дроби, 1 = 1/1, 2 = 2/1, -1 = -1/1, 0 = 0/1 и т.д.

Почему это важно? Потому что Иррациональные числа не включают в себя Целые и Натуральные числа, это отдельный класс чисел.

Иррациональные

Берём определение из Википедии.

Иррациональное число — это вещественное число, которое не является рациональным, то есть не может быть представлено в виде обыкновенной дроби m/n, где m,n — целые числа, n != 0. Иррациональное число может быть представлено в виде бесконечной непериодической десятичной дроби.

Так же приведу примеры иррациональных чисел, чтобы стало понятно: π (число пи), e (число Эйлера), √2.

Вы начали что-то подозревать? Если нет я помогу вам.

Первое предложение определения — это то, о чём я вам говорил, то, что Иррациональные числа — это отдельный класс чисел и он не включает в себя Целые и Натуральные.

Но самое важное здесь это второе предложение "Иррациональное число может быть представлено в виде бесконечной непериодической десятичной дроби.".

Что это значит? Заметили, что в примерах я дал вам буквенное обозначение? Это не просто так, это представление иррационального числа, ВАЖНО - сама запись π это не само иррациональное число, это всего лишь его представление, и оно является чем угодно, но не иррациональным числом. Само Иррациональное число оно бесконечно. Понимаете?

То есть его невозможно записать по определению. Никакой памяти в компьютере не хватит чтобы его записать. Это невозможно!

И мало того что в большинстве (я не проверял прям на всех, но очень сомневаюсь, что хотя бы в одном это есть) языков в которых используется термин Вещественный тип нельзя чисто синтаксически сделать запись по типу: "double a = π", попросту будет ошибка компиляции, так ещё если и возможно с помощью латинских букв подключая библиотеки, то в конечном-то итоге эта переменная будет ссылаться на конечное представление, а то есть рациональное этого иррационального числа!

Всё с чем мы можем работать это ТОЛЬКО РАЦИОНАЛЬНЫЕ ЧИСЛА, представления иррациональных чисел они ТОЖЕ рациональные и ТОЛЬКО рациональные. Они большие, они могут быть ооооочень большими, но они всё равно рациональные!

R = Q ∪ I, если мы исключаем I из-за невозможности работы с ними в прямом смысле без представлений получается R' = R\I, R' = Q, а Q у нас рациональные числа.

Так почему же так много людей и весьма неглупых всё ещё допускают эту простую ошибку? Эту ошибку можно было описать в пару предложений, но я хотел донести до вас последовательно как к этому прийти, используя общепринятую терминологию.

Спасибо.

P.S. Это моя оригинальная статья AfterWing, не является переводом, доработкой другой какой-либо статьи на русском/английском и др. языках.

Комментарии (76)


  1. AfterWing Автор
    17.07.2022 14:17
    -14

    Конкурс. Практика критерий истинности

    И так я не увидел достаточного теоритического обоснования почему моя позиция не верна, поэтому я облегчу вам задачу и объявлю конкурс под названием "Практика критерий истинности". (ниже есть ответы на частые якобы контраргументы)

    Итак чтобы это статья была признана чушью, а я лично принёс извенения нужно сделать очень лёгкую вещь: Приведите пример любого иррационального числа, принимаются любые из списка в википедии, которое полностью можно записать в double или float. Так чтобы это не было в конечном итоге рациональным числом.
    Принимаются языки: C++/C#/Java. Почему они? В них есть типизация, в частности примитивные типы double и float и они (ЯП) всем знакомы, чтобы не было волшебных языков Упалумпа которые работают при определённых погодных условиях и т.д.
    Использовать стандартные примитивные типы double и float, опять же во избежания секретных оккультных ритуалов с магическими кастомными типами и лишней путаницы.
    И всё!

    Напоминаю позицию: "Double и Float не вещественные числа т.к. ни одно иррациональное число не входит в область покрываемых значений".

    Сразу отвечу здесь на пару якобых контраргументов:
    1.> А как же числа NaN и бесконечности?
    - Отвечаю, чтобы этот контраргумент был засчитан нужно доказать что NaN и бесконечности являются во первых числом, а во вторых иррациональными, а не например мнимыми, тогда это имеет смысл. Если это не иррациональные числа то, в чём тогда контраргумент заключается? Я же не утверждаю, что double или float принадлежит к какому-то классу чисел, я лишь говорю, что он точно не вещественный по причине неимения ни одного иррационального числа в своей области значений. А если вы согласны с тем, что можно называть любой тип любым классом чисел, если он покрывает хотябы один подкласс класса, то почему бы не называть по такой логике long и int комплексными?

    2.> Иррациональные числа бесконечны только в позиционной системе счисления.
    - А в какой системе счисления работает компьютер? В логарифмической? То, что в какой-то системе оно будет конечно я понимаю, на бумажке можно написать и представить, что это так додумывая, но компьютер работает в позиционной системе счисления и пользуется правилами позиционной системы счисления, следовательно и классификация чисел будет осуществляться по признакам позиционной системы счисления. В таком случае иррациональное число нельзя записать в виде обыкновенной дроби, но можно записать в виде бесконечной не переодической дроби. И возвращаясь к нашему конкурсу, приведите мне пример иррационального числа, которое полностью можно записать в double или float и его нельзя будет записать в виде обыкновенной дроби, достаточно любого из списка википедии.


  1. agalakhov
    16.07.2022 15:49
    +38

    Они не просто рациональные. Они еще и маленькое подмножество рациональных, где в знаменателе стоит степень двойки. Многие рациональные числа тоже нельзя записать как float или double.


  1. lxsmkv
    16.07.2022 15:54
    +1

    представляю себя преподавателем начальных курсов технических вузов

    и меееедленно начинаю ... объяснять. :)


    1. Fell-x27
      17.07.2022 07:52
      +2

      Меееедленно и надмееееннно.


      1. Tyusha
        17.07.2022 14:07
        +7

        Статья типа "вчера я узнал и должен поделиться с миром".


  1. nin-jin
    16.07.2022 16:04
    +26

    Если уж на то пошло, то и рациональными они тоже не являются, так как включают такие прекрасные значения как:

    • Положительная бесконечность

    • Отрицательная бесконечность

    • Вообще не число


  1. ReadOnlySadUser
    16.07.2022 16:06
    +17

    Не могу не оставить это здесь


  1. ComodoHacker
    16.07.2022 16:11
    +61

    Правильно будет сказать, что типы Double и Float используются для представления вещественных чисел в памяти компьютера. Не все вещественные числа могут быть представлены абсолютно точно, некоторые только приближенно. Это относится как к рациональным, так и к иррациональным числам.

    Точно также типы int, long и т.п. могут представить только некоторое подмножество целых чисел. Тем не менее их называют целыми типами и никто не возражает.

    Проблема имхо преувеличена.


    1. napa3um
      16.07.2022 17:10
      +24

      Автору на первом курсе не рассказали, что непрерывный физический мир моделируется на дискретном вычислительном устройстве, не рассказали о численных и аналитических решениях задач, и, кажется, ещё много о чём не рассказали.


      1. randomsimplenumber
        16.07.2022 17:33
        +4

        Мир местами непрерывный, местами квантовый, всё сложно.


        1. DrSmile
          16.07.2022 19:34
          +9

          Квантовый мир — он еще более непрерывный. В классике реализуется один вариант эволюции на экстремуме функционала действия S, в квантовом мире же реализуются все варианты эволюции с весом eiS одновременно. Это такая насмешка природы, что при добавлении непрерывности мир начинает проявлять дискретные свойства.


          1. vyatkh1
            16.07.2022 22:25
            +5

            В классике реализуется один вариант эволюции на экстремуме функционала действия S

            Причем, как нам сказал препод теормеха: "Природа ленива, поэтому идет кратчайшим путем". И развернули мы минимум этого функционала.


      1. truthfinder
        16.07.2022 19:31
        +5

        Первое применение слова ДИСКРЕТНЫЙ от начала статьи. Но от автора статьи это слово, видимо, утаили.


    1. ermouth
      16.07.2022 18:58
      +11

      Правильно будет сказать, что типы Double и Float используются для представления вещественных чисел

      Так это прямо в первом предложении из FP formats overview, из 754-2008: “This clause defines floating-point formats, which are used to represent a finite subset of real numbers”.

      Представление конечного подмножества вещественных чисел.

      Так что проблема не просто преувеличена, её нет вообще. Числа – вещественные, но просто не все, стандарт об этом прямо говорит.


      1. AfterWing Автор
        16.07.2022 19:17
        -8

        Чем это определение решает проблему? Определение говорит о том, что мощность множества конечное и не о чём другом.


        1. ermouth
          16.07.2022 23:30
          +6

          Напомните, в чём проблема? Если та, что в заголовке – то нет такой проблемы. Double и float конечные множества, состоящие из конкретных вещественных чисел (некоторые – не по одному разу денормализованными представлениями), а также бесконечностей, особых нулей и NaN-ов.


  1. panteleymonov
    16.07.2022 16:40
    +7

    "Вещественные числа dooble float" - это взгляд математика на программирование. Возникает такая же проблема когда теоретики С++ (или другого высокоуровневого языка или теории) начинают рассуждать о работе процессора (или чем-то вещественном и реальном).

    И все таки числа с плавающей точкой - это один из вариантов представления вещественного числа для вычислительной машины. А то что можно записать только часть рациональных, ну так получилось. Даже не все рациональные здесь имеются, то есть dooble рациональным тоже назвать нельзя. С точки зрения расчетов до нескольких знаков после запятой, число 1/3 0.3333333432674407958984375 можно считать как бесконечную дробь, в том числе и урезанную ПИ как полную запись.

    Кроме того и про int можно сказать что это не целые числа, потому что все возможные варианты туда не помещаются.

    (пака писал уже подобные мысли выше появились)


    1. Fell-x27
      17.07.2022 08:08
      +6

      Помню, в свое время, спорил в школе с биологичкой. Она на пену исходила, что человек - не животное... Млекопитающее, теплокровное, хордовое, но не животное.


      1. RabraBabr
        17.07.2022 08:50
        +3

        Как это человек не животное? Он более того примат, как например бабуин или макак.


  1. AfterWing Автор
    16.07.2022 16:56
    -23

    Не могу понять, где я писал, что double и float это не рациональные числа, потому что они не включают в себя всё множество рациональных чисел. Откуда это соломенное чучело, с которым вы спорите?


    1. Xobotun
      16.07.2022 17:21
      +16

      Так вывод, что double и float – не рациональные, сделан по индукции из вашей статьи.

      Если я правильно понял, то вы утверждаете, что поскольку посредством float из IEEE 754 нельзя представить числа из множества R, их некорректно называть вещественными.

      Люди вокруг утверждают, что их тогда и рациональными называть некорректно, поскольку не все числа из Q возможно представить без пгорешности в числовой сетке. И ещё @nin-jin заметил, что наличие двух нулей, NaN и двух бесконечностей тоже не очень сильно похоже на множество рациональных чисел.


      1. AfterWing Автор
        16.07.2022 17:34
        -24

        Так вывод, что double и float – не рациональные, сделан по индукции из вашей статьи.

        Видимо те кто делают такой вывод не знают как работает индукция.

        Если я правильно понял, то вы утверждаете, что поскольку посредством float из IEEE 754 нельзя представить числа из множества R, их некорректно называть вещественными.

        Нет не правильно, число 2.53 можно представить типом float и это число будет принадлежать множеству R.

        Люди вокруг утверждают, что их тогда и рациональными называть некорректно, поскольку не все числа из Q возможно представить без пгорешности в числовой сетке.

        Это выдуманый критерий из их головы, я такого не говорил.


        1. panteleymonov
          16.07.2022 18:35
          +9

          Это выдуманый критерий из их головы, я такого не говорил.

          По крайней мере вы утверждаете что их нельзя назвать вещественными, поскольку часть из них (как иррациональные) в них не входят. По той же аналогии их нельзя назвать и рациональными, поскольку также не включают в себя часть рациональных.


          1. AfterWing Автор
            16.07.2022 18:47
            -14

            По крайней мере вы утверждаете что их нельзя назвать вещественными, поскольку часть из них (как иррациональные) в них не входят.

            Нет, я такого не говорил, это не моя позиция


            1. ReadOnlySadUser
              17.07.2022 13:20
              +3

              Во многих источниках тип double и float, числа с плавающей запятой/точкой зачем-то называют вещественными. Такое чувство что кто-то когда-то совершил ошибку или не внимательно написал эту глупость и все как один начали её повторять, совершенно не задумываясь о чём они говорят.

              Так почему же так много людей и весьма неглупых всё ещё допускают эту простую ошибку? Эту ошибку можно было описать в пару предложений, но я хотел донести до вас последовательно как к этому прийти, используя общепринятую терминологию

              R = Q ∪ I, если мы исключаем I из-за невозможности работы с ними в прямом смысле без представлений получается R' = R\I, R' = Q, а Q у нас рациональные числа.

              Это тогда что?


        1. Tiriet
          16.07.2022 21:18
          +3

          А 1/5=0.2 нельзя точно представить типом флоат, хотя она и принадлежит множеству рациональных.


        1. Fil
          16.07.2022 21:47
          +11

          число 2.53 можно представить типом float

          Это как? Ближайшее приближение для 2.53, которое можно представить во float — 1.2649999856948853 * 2 == 2.5299999713897706


        1. lamerok
          17.07.2022 09:02
          +4

          Нет не правильно, число 2.53 можно представить типом float и это число будет принадлежать множеству R.

          А можете показать, как будет выглядеть 2.53 во float? Есть веские основания полагать, что невозможно 2.53 представить во float.


          1. ewgeniy2004
            17.07.2022 09:16
            +2

            Ради интереса посмотрел в онлайн конвекторе double:2.529999999999999804600747665972448885440826416015625; single: 2.5299999713897705078125

            Ps не заметил что уже написали


  1. JordanCpp
    16.07.2022 17:05
    -7

    Это что это автор удумал? Какие такие числа не вещественные. Это теперь, что все книги по программированию переписывать?:) Проще вас отменить, согласно повесточке, как токсичного и подрывающего основы:):):)


    1. alt78
      17.07.2022 06:01
      -1

      Пожалуйста, не нужно говорить про "отменить", это плохая шутка.

      Тем более, что такое уже было, и именно по этому поводу - вспомните Пифагора и Гиппаса.


  1. k12th
    16.07.2022 18:18
    +13

    Все черные кошки — являются кошками. Но не всякая кошка — черна. Ergo, черные кошки — не кошки.

    * Согласно стандарту IEEE 754-CAT существуют так же три специальных черных кошки: ваще-не-кошка, супер-кошка и недо-кошка.


    1. tehnolog
      17.07.2022 07:50
      +4

      Эй, полегче. Котиков не обижать!


  1. Spaceoddity
    16.07.2022 18:32
    +2

    Если уж вы так ударились в строгую терминологию, то числа  π и e - не иррациональные, а трансцендентные (поскольку иррациональность вытекает из трансцендентности, но не наоборот). Так что ваш пример не совсем корректен.


    1. AfterWing Автор
      16.07.2022 19:35
      -5

      1. Spaceoddity
        16.07.2022 19:51
        +1

        Что? Зачем вы мне цитируете то, что я выше как раз и сформулировал? Пи и е - и трансцендентные, и иррациональные числа. Но трансцендентность тут первична - как подмножество иррациональных чисел. Вот цитата по первой же вашей ссылке:

        Каждое трансцендентное вещественное число является иррациональным, но обратное неверно.

        А значит ставить в пример "доказательства невозможности записи иррационального числа конечной дробью" трансцендентное число - некорректно! Трансцендентное число не то что дробью - уравнением записать не получится.


  1. aversey
    16.07.2022 19:39
    +3

    Вещественные числа можно представлять в виде функций, принимающих требуемую точность и возвращающих приближение в виде рационального числа (пары длинно-арифметических (т.е. произвольно больших) целых). Рациональные числа (3, 0.1, ...) в таком функциональном представлении независимо от требуемой точности возвращают самих себя в виде пары. Иррациональные числа (число пи, число Эйлера, ...) описываются вычисляющей их с заданной точностью функцией. Операции и функции (+, корень, ...) принимают и возвращают вещественные числа -- то есть функции (в соответствии с представлением). Возвращаемая функция (результат) должна запомнить аргументы операции -- при передаче ей точности она вычисляет требуемую точность подвыражений, запрашивает их приближения и вычисляет своё приближение. Если надо посчитать сумму с абсолютной погрешностью не более d, можно запросить подвыражения с абсолютной погрешностью не более d/2 и сложить полученные рациональные приближения (пример на Python):

    def add(a, b):
        return (lambda d: a(d/2) + b(d/2))

    Необязательно представлять эти числа именно в виде функций (в чистом Си нет лямбд) -- можно и в виде дерева, но мысль останется та же. Число пи в этом представлении, как и в математике -- это не полная запись его значения в виде числа с плавающей точкой, но запись его определения в виде вычисляющей его функции -- важно отметить, что числа при этом не просто большие, а произвольно большие (и произвольно точные -- но не бесконечно). Называется это всё символьными вычислениями, и, конечно, у них есть минусы, но сейчас не об этом.

    Но самое важное здесь это второе предложение "Иррациональное число может быть представлено в виде бесконечной непериодической десятичной дроби.".

    Что это значит? Заметили, что в примерах я дал вам буквенное обозначение? Это не просто так, это представление иррационального числа, ВАЖНО - сама запись π это не само иррациональное число, это всего лишь его представление, и оно является чем угодно, но не иррациональным числом. Само Иррациональное число оно бесконечно. Понимаете?

    То есть его невозможно записать по определению. Никакой памяти в компьютере не хватит чтобы его записать. Это невозможно!

    И в самом деле, самое важное -- что "иррациональное число может быть представлено в виде бесконечной непериодической десятичной дроби". А может и не быть (кроме того, тут слово "представлено" имеет значение отличное от "записано" и ближе к "воображено"). Запись π ровно так же отражает стоящее за ней иррациональное число, как и воображаемое бесконечное число с плавающей точкой, только вот второе и в самом деле нельзя записать, а потому оно может помочь говорить о некоторых свойствах числа пи, но никак не может быть его определением (в некотором смысле как раз "является чем угодно, но не иррациональным числом"). Настоящим определением числа пи может служить, скажем, "периметр единичной окружности" или "корень из ряда обратных квадратов, умноженного на шесть". И вот у нас уже есть запись числа π, вмещающаяся не то что в память компьютера, а даже на клочок бумаги.

    На этом конструктив и критику заканчиваю -- спасибо автору за внимание к такому тонкому вопросу как представление чисел в компьютерах и языках программирования!


    1. DrSmile
      16.07.2022 22:11
      +1

      Вот только, если существует конечный алгоритм вычисления с заданной точностью, то это, всего лишь, счетное подмножество вещественных чисел. Для почти всех иррациональных чисел конечного алгоритма вычисления не существует.


      1. aversey
        17.07.2022 00:57
        +1

        Согласен, спасибо за замечание, неаккуратно написал.


  1. runaway
    16.07.2022 19:53
    +3

    но очень сомневаюсь, что хотя бы в одном языке в которых используется термин Вещественный тип нельзя чисто синтаксически сделать запись по типу: "double a = π", попросту будет ошибка компиляции

    Ну формально в "Матлабе" можно. Есть константа pi. Это раз.

    Запись вида sqrt(7) - это тоже, извините меня, запись. И корень из семи не очень рационален. Это два.


  1. maxp
    17.07.2022 09:49
    +8

    Возможно тут уже про это написали, но если вдруг нет -

    "Само Иррациональное число оно бесконечно. Понимаете?"

    В данном случае число конечно, а бесконечен лишь один из вариантов его записи десятичными цифрами, и не более. Понимаете?


  1. MegaMANGO
    17.07.2022 10:41

    Во-первых, "да ну, а я не знаааал!". Некая банальщина, рассчитанная на самых-самых зелёных, не очень понимаю что она делает на таком сайте как Хабр. Во-вторых, их тогда нельзя считать числами в привычном понимании математиков в принципе. Вы знаете, чем 0 и 0 + 0/10 отличаются? Вот и я не знаю. А 0.0 в большинстве языков программирования – отдельное от число. Да и большинство дробных значений, которые возможно представить в виде дроби х/10^у невозможно представить в виде float, т к переменная тупо ограничена по памяти. И в -третьих, "иррациональное число оно бесконечно. Понимаете?" Это не иррациональное число, лмао. 15/7 можно спокойно записать в 7меричной системе счисления, или используя скобки (2,00(6))


    1. ya_ne_znau
      17.07.2022 12:27

      "Скобки" принято называть "периодом", если правильно помню


  1. sargon5000
    17.07.2022 10:59
    +2

    Не понимаю переживания автора. Числа типа double и float – это не полное множество вещественных чисел, а всего лишь счетное подмножество (это знают не только студенты, но и многие школьники), но разве от этого они перестают быть вещественными? Автор может назвать хоть одно число типа double (оставим пока NaN и inf), которое не являлось бы вещественным? По логике автора дети – не люди, поскольку множество детей является только подмножеством множества людей. Так ведь, автор?


  1. ProLimit
    17.07.2022 11:15

    Автор решил поумничать, но сам же допустил эту "ошибку" (в кавычках), т.к. стандарт дает вполне корректное определение, что double представляет только конечное подмножетсво вещественных чисел, В ТОМ ЧИСЛЕ и рациональных. И в это заявление " Всё с чем мы можем работать это ТОЛЬКО РАЦИОНАЛЬНЫЕ ЧИСЛА " в смысле противопоставления их иррациалнальным, ошибочно.


  1. Busla
    17.07.2022 11:53

    Но самое важное здесь это второе предложение "Иррациональное число может быть представлено в виде бесконечной непериодической десятичной дроби.".

    а какая связь между float и double и десятичными дробями?

    Подсказка: никакой. Во float и double используется двоичная дробь.

    Само Иррациональное число оно бесконечно. Понимаете?

    Нет, это вы не понимаете. Я за основание системы исчисления могу взять Пи, и у меня сразу пачка иррациональных чисел станет конечными. Например, почти вся школьная тригонометрия идёт в системе исчисления по основанию Пи.


    1. edo1h
      18.07.2022 00:19

      а какая связь между float и double и десятичными дробями?

      Подсказка: никакой. Во float и double используется двоичная дробь.

      любая конечная двоичная дробь может быть представлена в виде конечной же десятичной


    1. ermouth
      18.07.2022 12:58

      Я за основание системы исчисления могу взять Пи, и у меня сразу пачка иррациональных чисел станет конечными.

      Более того, вы можете взять за основание ф – (1 + √5)/2 – и в такой системе счисления не только пачка иррациональных чисел будет с конечной записью, но и как ни странно все целые )


  1. SlFed
    17.07.2022 12:17
    +7

    Вспомнилось почти по теме как правильно называть

    Одесса, "Привоз", рыбный ряд. Тётка:
    - Бички́!!! Бички́!!!
    Приезжий:
    - Правильно - "бычки".
    - Правильно - "Neogobius fluviatilis", малохольный, а бычки докуривал ваш папа в детдоме, когда я уже тут бички торговала.


  1. AfterWing Автор
    17.07.2022 14:17
    -14

    Конкурс. Практика критерий истинности

    И так я не увидел достаточного теоритического обоснования почему моя позиция не верна, поэтому я облегчу вам задачу и объявлю конкурс под названием "Практика критерий истинности". (ниже есть ответы на частые якобы контраргументы)

    Итак чтобы это статья была признана чушью, а я лично принёс извенения нужно сделать очень лёгкую вещь: Приведите пример любого иррационального числа, принимаются любые из списка в википедии, которое полностью можно записать в double или float. Так чтобы это не было в конечном итоге рациональным числом.
    Принимаются языки: C++/C#/Java. Почему они? В них есть типизация, в частности примитивные типы double и float и они (ЯП) всем знакомы, чтобы не было волшебных языков Упалумпа которые работают при определённых погодных условиях и т.д.
    Использовать стандартные примитивные типы double и float, опять же во избежания секретных оккультных ритуалов с магическими кастомными типами и лишней путаницы.
    И всё!

    Напоминаю позицию: "Double и Float не вещественные числа т.к. ни одно иррациональное число не входит в область покрываемых значений".

    Сразу отвечу здесь на пару якобых контраргументов:
    1.> А как же числа NaN и бесконечности?
    - Отвечаю, чтобы этот контраргумент был засчитан нужно доказать что NaN и бесконечности являются во первых числом, а во вторых иррациональными, а не например мнимыми, тогда это имеет смысл. Если это не иррациональные числа то, в чём тогда контраргумент заключается? Я же не утверждаю, что double или float принадлежит к какому-то классу чисел, я лишь говорю, что он точно не вещественный по причине неимения ни одного иррационального числа в своей области значений. А если вы согласны с тем, что можно называть любой тип любым классом чисел, если он покрывает хотябы один подкласс класса, то почему бы не называть по такой логике long и int комплексными?

    2.> Иррациональные числа бесконечны только в позиционной системе счисления.
    - А в какой системе счисления работает компьютер? В логарифмической? То, что в какой-то системе оно будет конечно я понимаю, на бумажке можно написать и представить, что это так додумывая, но компьютер работает в позиционной системе счисления и пользуется правилами позиционной системы счисления, следовательно и классификация чисел будет осуществляться по признакам позиционной системы счисления. В таком случае иррациональное число нельзя записать в виде обыкновенной дроби, но можно записать в виде бесконечной не переодической дроби. И возвращаясь к нашему конкурсу, приведите мне пример иррационального числа, которое полностью можно записать в double или float и его нельзя будет записать в виде обыкновенной дроби, достаточно любого из списка википедии.


    1. nin-jin
      17.07.2022 14:44

      Вы сначала докажете, что иррациональные числа вообще являются числами, а не бесконечными последовательностями рациональных чисел, как бесконечно малое и бесконечно большое.


    1. miksoft
      17.07.2022 14:56

      А в какой системе счисления работает компьютер?
      В любой, которую можно математически формализовать.
      Принципиально ничего не мешает вести расчеты, например, в римских цифрах. Этого не делают просто потому что неудобно.

      Иррациональные числа бесконечны
      Вы опять путаете бесконечность числа и бесконечность его записи.

      конкурс под названием «Практика критерий истинности»
      Давайте начнем прямо с заголовка статьи. Цитирую: «Double, Float — не вещественные числа». Приведите, пожалуйста, пример числа, которое не является вещественным, но которое можно хранить в типах Double и Float. Специальные значения типа NaN не считаем.


    1. ReadOnlySadUser
      17.07.2022 20:29
      +1

      Слыхали про чайник Рассела? Если нет, крайне рекомендую ознакомиться)

      А так. Ну, я вот могу записать число Пи полностью хоть в double, хоть во float. Вот:

      float x = 1.0;

      Где x - это значение Пи в системе счисления по основанию Пи. Вот прям полностью влезло.


      1. miksoft
        17.07.2022 22:39

        Только это не будет float (binary32) в терминах IEEE 754


        1. ReadOnlySadUser
          18.07.2022 03:07

          Стандарт не читал, так что, если можно, поконкретнее


          1. miksoft
            18.07.2022 23:59

            В стандарте IEEE 754 описаны только двоичные и десятичные числа. Чисел по основанию Пи там нет.
            Да и у большинства компиляторов для числовых литералов подразумевается десятичная система, если не указано никаких модификаторов. Т.е. 1.0 в Пи просто так не превратится.


      1. edo1h
        19.07.2022 00:40

        float x = 1.0;

        вы хотели, наверное, x = 10 написать


        1. ReadOnlySadUser
          19.07.2022 05:41

          Да, тупанул немножечко


    1. panteleymonov
      18.07.2022 00:00
      +1

      И так я не увидел достаточного теоритического обоснования почему моя позиция не верна ...

      Напоминаю позицию: "Double и Float не вещественные числа т.к. ни одно иррациональное число не входит в область покрываемых значений".

      Ищем 10 отличий.


    1. edo1h
      18.07.2022 00:26
      +2

      Итак чтобы это статья была признана чушью, а я лично принёс извенения нужно сделать очень лёгкую вещь: Приведите пример любого иррационального числа, принимаются любые из списка в википедии, которое полностью можно записать в double или float.

      читаем заголовок: Double, Float — не вещественные числа


      чтобы вашу статью не признать чушью, которой она является, ждём от вас пример float или double, не являющего вещественным. да, можно было бы побыть занудой и вспомнить про inf и nan, но вы-то в статье написали совсем другое.


      если бы вы написали в статье «c помощью double можно представить числа из подмножества множества конечных двоичных дробей, которое является подмножеством рациональных чисел, которое является подмножеством множества вещественных чисел, которое является подмножеством множества комплексных чисел, которое является подмножеством… ну пусть множества кватернионов, которое в свою очередь является подмножеством… (продолжать можно бесконечно); немного странно, что из этой цепочки мы выбрали именно вещественные числа», то к вашей статье никаких претензий бы не было; но вы почему-то выбрали броский и по сути неверный заголовок.


      1. edo1h
        18.07.2022 01:01

        вдогонку: почему именно вещественные на самом деле понятно: с помощью float или double можно записать вещественные числа с некоторой (приемлемой во многих практических задачах) точностью. и проще использовать float/double везде, где нам нужны в расчётах эти самые вещественные числа не задумываясь о том рациональные они или нет, а если рациональные — то каково основание дроби.
        с комплексными числами, например, такой трюк не прокатит, не существует прямого способа записать с помощью double i и 2i, да ещё и отличить их друг от друга.


    1. AfterWing Автор
      18.07.2022 15:01

      С удовольстием бы ответил каждому в комментарий, но вы сами накидали мне минус кармы и теперь я не могу комментировать чаще 1 раза в день по правилам сайта. Сами себе палки в колёса вставили))


      1. KanuTaH
        18.07.2022 20:24
        +4

        Это намек на то, что, возможно, вам стоит заняться чем-то более полезным для общества, чем оторванные от реальности казуистические рассуждения в стиле "вся рота идет не в ногу, один подпоручик идет в ногу", при этом постоянно противореча самому себе.


  1. Anarchist
    17.07.2022 15:22

    Почти все double и float (за небольшим количеством исключений) - вещественные. Но не все вещественные - double или float.

    Но всё равно рад за автора, если он взялся за математику. Главное не остановливаться.


  1. randomsimplenumber
    17.07.2022 17:00

    Так то числа - это чисто математическая абстракция. Вне математики чисел нет. Есть различные способы представления чисел. Некоторые числа можно записать в виде суммы степеней 10, но нельзя в виде суммы степеней 2. То есть записать можно, но с погрешностью.


  1. sci_nov
    17.07.2022 18:33
    +1

    Горе от ума...


  1. Dasfex
    17.07.2022 22:58

    Непонятно, в чём проблема.
    Если один разработчик говорит "вещественное число", а второй его понимает (и в данном случае это верно для абсолютного числа адекватных разработчиков из двух любых точек мира), то терминология работает. А что там формальная математика говорит, никого волновать не должно.


  1. myazinn
    18.07.2022 10:19
    +4

    Ну так-то и целые числа (Int, long, и почти все остальные вариации) - не целые числа, потому что настоящие целые числа бесконечные. Что уж тут поделать, пиши вторую статью по этому поводу.


  1. iliar
    18.07.2022 11:35
    +2

    Наш учитель в институте любил фразу "точное решение ни кому не нужно, людям нужно решение с достаточной точностью".

    Это стандартные типы данных. Все знают, что работа с вещественными числами в компьютере сопряжена с потерей точности. Но в большинстве случаев эти типы дают достаточно правильный результат, чтобы на такие вещи закрыть глаза

    К слову в целочисленные типы данных тоже можно далеко не любое число записать.


  1. apomelov
    19.07.2022 09:30

    Ох, ничего себе понаписали комментариев за два дня! Старался их прочитать, чтобы не повториться. Мне понравилась цепочка определений -- вещественные, как рациональные с иррациональными, а иррациональные -- как вещественные без рациональных. Вернее не цепочка, а колечко..

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

    А если серьёзно, то я не понял посыла. Зря называем вещественными? Нет, не зря. Это приближение которого хватает в подавляющем большинстве задач. Например константа "пи" с точностью double позволяет вычислить длину окружности заданного диаметра для практически любой задачи. Дальше уже символьные вычисления -- но это отдельная тема.


    1. nin-jin
      19.07.2022 10:04

      Деление - не самостоятельная операция, а решение уравнения с умножением. А решение у уравнения может быть не одно, а, например, ни одного (1/0), 2(sqrt(1)), и даже бесконечно много (0/0).


      1. apomelov
        19.07.2022 10:41

        Не очень понятно, что значит не самостоятельная операция. Теория чисел вводит определения последовательно, и логично предположить, что очередные определения могут ссылаться только на те, которые уже есть на данный момент. Если у вас есть целые числа и умножение на них, вы, бесспорно, можете написать уравнение 2x=1, только оно тоже не будет иметь решения. Это тупик.

        На самом деле если ту же википедию проскролить чуть дальше содержания, там будет "формальное определение", которое не страдает этой проблемой.

        Так же как в школе когда-то давали "определение" целым как "натуральные, им противоположные и ноль". Нету у натуральных чисел противоположных, так как нет вычитания. Уравнение x+5=3 вполне понятно в натуральных, но не имеет там решений. Целые числа определяются через натуральные по аналогии с тем, как рациональные через целые. Вот только в шестом классе, когда часть "математики" начала гордо зваться "алгеброй", это можно было объяснить далеко не всем.


        1. nin-jin
          19.07.2022 11:05

          А вас в шестом классе не учили прикладывать гиперссылки на материалы, на которые ссылаетесь?


          1. apomelov
            19.07.2022 11:19

            Нет, когда я учился в шестом классе, интернет был еще не тот, тогда больше книжки читали:) если хотите почитать Википедию, то вот: Формальное определение.


        1. nin-jin
          19.07.2022 12:16

          Несамостоятельная операция - та, которая вводится как решение уравнения с другими операциями.

          Ну а рациональные числа являются подмножеством целочисленных дробей. Деление тут ни при чём.


          1. apomelov
            19.07.2022 12:46

            Ну мы опять по кругу ходим. Дроби -- это как числа, противоположные натуральным -- способ объяснить ребенку на пальцах то, что и так почти понятно. Но не определение. Вот надо три пиццы на четверых разделить, мы и разрезаем каждую на четыре части и берём по три куска.

            До того, как определены рациональные числа, уравнение 2x=1 не имеет решений. После того, как мы ввели рациональные числа как множество классов эквивалентности над парами целых, ввели операции, доказали корректность этих определений (независимость от выбора представителя класса) вот тогда уже можно сказать "а давайте вместо кортежа (a, b) будем писать a/b и назовем эту запись обыкновенной дробью". Тогда можно решать новые уравнения и так далее.

            Точно так же не получится определить алгебраические числа, как корни полиномов. До введения вещественных чисел уравнение x²=2 не имеет решений. Не получится определить квадратный корень как несамостоятельную операцию. Сначала вводим вещественные числа, потом радуемся, что в них больше уравнений решается. Но всё ещё не все.

            Надо ли упомянуть, что комплексная мнимая единица не определяется, как квадратный корень из -1?..


            1. nin-jin
              19.07.2022 13:24

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