Ответить
  • Mahagam Senior Member
    офлайн
    Mahagam Senior Member

    4006

    17 лет на сайте
    пользователь #83779

    Профиль
    Написать сообщение

    4006
    # 12 марта 2018 00:13
    gooblin:

    про минус 1 вопрос спорный

    ничего спорного, так как практически ничего кроде одного варианта на практике не применяется, и ноги этого растут из поддержки этого варианта железом.

    gooblin:

    что есть предел точности

    и для многих апологетов всего нового и хипстерского будет ударом узнать, что когда-то компы нативно могли считать точнее чем современный double ))

    To a C programmer strong typing means pressing the keys harder
  • Неизвестный кот Senior Member
    офлайн
    Неизвестный кот Senior Member

    12519

    21 год на сайте
    пользователь #6965

    Профиль

    12519
    # 12 марта 2018 00:48 Редактировалось Неизвестный кот, 1 раз.
    Mahagam:

    и для многих апологетов всего нового и хипстерского будет ударом узнать, что когда-то компы нативно могли считать точнее чем современный double ))

    Да хипстерам фиолетово сколько там бит под fraction выделено. Они так глубоко не лезут.

    А по поводу современного double - в последней версии IEEE Std 754 определен тип данных binary128 - уже поддерживается нативно в SPARC и PA-RISC и IBM POWER, и даже есть уже в этом стандарте возможность делать binary256 - когда его архитектуры процессоров начнут поддерживать получится даже больше чем когда-то в старых компах.

    я имею ввиду версию стандарта от 2008 года - вот она для пруфа: eng.umb.edu/~cuckov/classes/engin341/Reference/IEEE754.pdf

    старая версия от 1985 года - там только float и double - для пруфа: http://www.wellposed.com/standards-documents-cache/IEEE754-1985.pdf

    НКХЖЕХВ
  • Korben_Dallas Senior Member
    офлайн
    Korben_Dallas Senior Member

    2843

    13 лет на сайте
    пользователь #395360

    Профиль
    Написать сообщение

    2843
    # 12 марта 2018 01:45 Редактировалось Korben_Dallas, 4 раз(а).

    Правильным ответом на вопрос о том, как представлен float и double, скажем, в языках C и C++ является ответ "это определяется реализацией". Ни один, ни другой не принимают IEEE 754 в качестве требуемого представления.

    А "самоучек от сохи", которые ночью при свете лучины разглядывали биты в памяти, "знают как устроен компьютер", и думают, что они что-то после всего этого поняли, приходятся потом переучивать с нуля, когда они впервые в жизни сталкиваются в языке С (который они считали чуть ли не ассемблером) со strict-overflow semantics, strict-aliasing semantics и тому подобным "неассемблерным" поведением. Вопли "так ведь у Коляна из третьего подъезда это точно работало, зуб даю" идут непрерывным потоком.

    Добавлено спустя 17 минут 34 секунды

    Mahagam:

    так и тут, выбираете чем именно хотите заниматься, и после этого вопрос "какой язык выбрать" вероятно отпадёт.

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

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

    Однако по какой-то мне совсем не понятной причине эта простая аксиома вызвала нешуточное "бурление фекалий" среди местной "пионэрии". Отчасти их можно понять: ясно, что не всегда можно получить в Беларуси те предметные знания, которые получают в Кремниевой Долине. Но для успешного старта - все есть.

    Et si tu tombes 7 fois Toujours se relever 8
  • Mahagam Senior Member
    офлайн
    Mahagam Senior Member

    4006

    17 лет на сайте
    пользователь #83779

    Профиль
    Написать сообщение

    4006
    # 12 марта 2018 02:20
    Korben_Dallas:

    "это определяется реализацией"

    если не брать уникальные/экзотические Compaq/DEC/IBM/Cray машины, которые выпилены из элитных пород кремния, то с инженерной точки зрения нормальным ответом будет IEEE754.
    и это - те две конские задницы, которые будут жить в веках.

    Korben_Dallas:

    и, разумеется, с королем всего этого - undefined behavior

    фанаты UB подвисают, когда null pointer - это вдруг бывает нормально, и строки вида int *foo = NULL; (*foo)++; - работают :trollface:

    To a C programmer strong typing means pressing the keys harder
  • Korben_Dallas Senior Member
    офлайн
    Korben_Dallas Senior Member

    2843

    13 лет на сайте
    пользователь #395360

    Профиль
    Написать сообщение

    2843
    # 12 марта 2018 04:13 Редактировалось Korben_Dallas, 14 раз(а).
    Mahagam:

    фанаты UB подвисают, когда null pointer - это вдруг бывает нормально, и строки вида int *foo = NULL; (*foo)++; - работают

    Намного интереснее наблюдать подвисание "фанатов UB" когда компилятор транслирует

    for (int i = 0; i >= 0; i++)
    ...

    в бесконечный цикл, несмотря на то, что они "точно знают из ассемблера (и Колян подтвердит)", что при переполнении знаковой переменной ее значение должно стать отрицательным и цикл якобы должен завершиться.

    Или когда компилятор в коде

    void SomeClass::SomeMethod()
    {
    if (this != 0)
    ...
    }

    рассматривает условие `this != 0` как заведомо истинное и выкидывает проверку из кода вообще ("а ведь в Борланде работало" )

    Или как при возвращении ссылки/указателя на локальную переменную

    char *foo()
    {
    char hw[] = "Hello World";
    return hw;
    }

    компилятор нагло подставляет в качество возвращаемого значения нулевой указатель ("а ведь в Борланде работало" ).

    Современные компиляторы С и С++ троллят разношерстных "кул-хацкеров" в хвост и в гриву. И введение в GCC поддержки strict-aliasing semantics, и знаменитая история с направлением копирования в `memcpy`, вызвала, помнится, свое время некрасивые истерики аж со стороны примадонны Торвальдса. Но ребята из GCC лишь молча улыбаются в ответ :trollface:

    Вот также и ваше `int *foo = NULL; (*foo)++;` компиляторы скоро либо просто начнут выкидывать из кода, либо будут назло сегфолтить программу даже на тех платформах, на которых это раньше не сегфолтилось . Чтобы не повадно было.

    P.S. Какого черта онлайнеровский форум транслирует символы внутри тега code???

    Et si tu tombes 7 fois Toujours se relever 8
  • Mahagam Senior Member
    офлайн
    Mahagam Senior Member

    4006

    17 лет на сайте
    пользователь #83779

    Профиль
    Написать сообщение

    4006
    # 12 марта 2018 04:57
    Korben_Dallas:

    Намного интереснее наблюдать подвисание "фанатов UB" когда компилятор транслирует

    for (int i = 0; i >= 0; i++)
    в бесконечный цикл, несмотря на то, что они "точно знают из ассемблера (и Колян подтвердит)", что переполнении знаковой переменной ее значение должно стать отрицательным и цикл якобы должен завершиться.

    это точно си? а с чего это надо продолжать пользоваться компилятором который придумывает "правильное" поведение программы?

    Korben_Dallas:

    компилятор нагло подставляет

    именно что нагло.

    To a C programmer strong typing means pressing the keys harder
  • Korben_Dallas Senior Member
    офлайн
    Korben_Dallas Senior Member

    2843

    13 лет на сайте
    пользователь #395360

    Профиль
    Написать сообщение

    2843
    # 12 марта 2018 05:08 Редактировалось Korben_Dallas, 11 раз(а).
    Mahagam:

    Korben_Dallas:

    Намного интереснее наблюдать подвисание "фанатов UB" когда компилятор транслирует

    for (int i = 0; i >= 0; i++)
    в бесконечный цикл, несмотря на то, что они "точно знают из ассемблера (и Колян подтвердит)", что переполнении знаковой переменной ее значение должно стать отрицательным и цикл якобы должен завершиться.

    это точно си?

    Точно. А почему возник такой вопрос?

    Mahagam:

    а с чего это надо продолжать пользоваться компилятором который придумывает "правильное" поведение программы?

    Вопрос не совсем ясен.

    Во-первых, в придумывании "правильного" поведения программы ничего странного нет. Компилятор должен придумывать "правильное" поведение программы в ситуациях, когда имеет место implementation-defined behavior. Так было всегда.

    Во-вторых, здесь ситуация еще "свободнее": согласно спецификации языка, при возникновении знакового арифметического переполнения поведение С (и С++) программы не определено (undefined behavior). А undefined behavior - это совсем другая история:

    1) не существует "правильного" или "неправильного" поведения, и
    2) как ни верти, а поведение программы придется "придумывать", ибо стандартом оно не определено.

    Вы придумали свое поведение и почему-то решили, что оно - правильное. Тем, кто занимается такими выдумками для случаев undefined behavior (!), надо больно давать по рукам. Что GCC с радостью и делает.

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

    Et si tu tombes 7 fois Toujours se relever 8
  • Неизвестный кот Senior Member
    офлайн
    Неизвестный кот Senior Member

    12519

    21 год на сайте
    пользователь #6965

    Профиль

    12519
    # 12 марта 2018 09:33

    Korben_Dallas, а кто говорит что надо пытаться угадать что будет делать компилятор в случае undefined behavior - по моему это и ежу понятно. :)

    НКХЖЕХВ
  • human0id Member
    офлайн
    human0id Member

    487

    17 лет на сайте
    пользователь #74992

    Профиль
    Написать сообщение

    487
    # 12 марта 2018 10:22
    olezha_:

    Лол) как уже только ни пытаются обосрать айтишников: больные, кривые, косые, жирные, импотенты :D
    Товарищи, не становитесь айтишниками! Полно профессий за попиццот! Зато точно писька стоять будет :lol:
    Хоспаде, какие же идиоты бывают.

    Зависть плохое чувство :)

  • horoshaya-91-91 Neophyte Poster
    офлайн
    horoshaya-91-91 Neophyte Poster

    3

    11 лет на сайте
    пользователь #687007

    Профиль
    Написать сообщение

    3
    # 12 марта 2018 10:30

    А мой 9-ти летний сын в онлайн-школе занимается программированием. Раньше сидел за компьютером играл днями и все, теперь занимается с тренером по скайпу, сам игры делает. И приятно и полезно. Пока нравиться, пусть занимается, а надоест найдем новое увлечение. [censored by Grace-o]

  • Korben_Dallas Senior Member
    офлайн
    Korben_Dallas Senior Member

    2843

    13 лет на сайте
    пользователь #395360

    Профиль
    Написать сообщение

    2843
    # 12 марта 2018 10:34 Редактировалось Korben_Dallas, 1 раз.
    gooblin:

    Korben_Dallas, а кто говорит что надо пытаться угадать что будет делать компилятор в случае undefined behavior - по моему это и ежу понятно. :)

    Я веду речь о тех идивидуумах, которые пытаются настаивать на конкретных "единственно правильных" проявлениях неопределенного поведения, ссылаясь на собственный опыт и бессонные ночи, занятые разглядыванием "ассемблера". Недостатка в них нет. И на stackoverflow, и на ru.stackoverflow, и на cyberforum.ru вопросы на эти темы всплывают часто. И если новичкам еще несложно вбить в головы правильные установки, то самозваным "икзпердам", которые "уже 20 лет так программируют", приходится разжевывать цитаты из стандарта и вбивать в голову чуть ли не кувалдой.

    Et si tu tombes 7 fois Toujours se relever 8
  • Неизвестный кот Senior Member
    офлайн
    Неизвестный кот Senior Member

    12519

    21 год на сайте
    пользователь #6965

    Профиль

    12519
    # 12 марта 2018 10:40

    соглашусь со всем, кроме

    Korben_Dallas:

    бессонные ночи, занятые разглядыванием "ассемблера".

    польза в этом есть, в некоторых областях (системное программирование, embedded, обратная разработка) хороший специалист должен знать какие машинные инструкции генерит компилятор из исходного кода под его target. Хотя со временем понимаешь что ночью надо спать :)

    НКХЖЕХВ
  • Yosic Senior Member
    офлайн
    Yosic Senior Member

    10819

    21 год на сайте
    пользователь #6433

    Профиль
    Написать сообщение

    10819
    # 12 марта 2018 12:47

    ИМХО. Спор ни о чем. И ежу понятно, что если делается кросс платформенная система которая должна собираться на разных системах, зачастую с разными компиляторами, и имеет жизненный цикл не пол года, а куда больше, то там нельзя полагаться ни на какие особенности поведения конкретного компилятора, даже если вы их знаете.
    А на счет ребят из GCC, то они могут посмееваться над чем хотят, только им нужно помнить, что компилятор - это инструмент, а не сферический конь в вакууме. И если они будут так весело смеяться и бить по рукам, что их инструментом предпочтут не пользоваться, то им легко станет не до смеха.:) Я сам, в своей практике, не пишу выражений которые могут быть поняты не однозначно или требуют знаний каких-то нигде не определенных вещей. А если есть место которое не понятно сходу - ставлю поясняющий комментарий.

  • Mahagam Senior Member
    офлайн
    Mahagam Senior Member

    4006

    17 лет на сайте
    пользователь #83779

    Профиль
    Написать сообщение

    4006
    # 12 марта 2018 14:28
    Korben_Dallas:

    А почему возник такой вопрос?

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

    код выделить все
    for (int i = 0; i >= 0; i++) {
    important_var = sqrt((double(i));
    ...
    }

    как ему удастся выдать тут бесконечный цикл? я же имею право полагать, что i у меня никогда не будет отрицательным числом.
    и вообще, с какого перепуга там вышел бесконечный цикл? есть этому логическое объяснение? в случае если язык - не си, то такое объяснение можно объяснить что тип int - не тот, что в си.

    Korben_Dallas:

    Вы придумали свое поведение и почему-то решили, что оно - правильное.

    разберём пример

    код выделить все
    char *foo()
    {
    char hw[] = "Hello World";
    return hw;
    }

    компилятор тут должен а) создать переменную, б) расположить её в памяти в)вернуть на неё указатель.
    то, что адрес после выход будет не валидный, это уже компилятор не должно волновать. да, переменная hw была на стеке, да, после выхода их функции стек размотался и там уже не "Hello World". но кого это должно волновать? с какого перепугу компилятор выдумывает ноль?
    а если hw сделать const, так вообще пример должен корректно работать.

    To a C programmer strong typing means pressing the keys harder
  • Неизвестный кот Senior Member
    офлайн
    Неизвестный кот Senior Member

    12519

    21 год на сайте
    пользователь #6965

    Профиль

    12519
    # 12 марта 2018 14:47 Редактировалось Неизвестный кот, 2 раз(а).
    Mahagam:

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

    for (int i = 0; i >= 0; i++) {
    important_var = sqrt((double(i));
    ...
    }

    как ему удастся выдать тут бесконечный цикл? я же имею право полагать, что i у меня никогда не будет отрицательным числом.и вообще, с какого перепуга там вышел бесконечный цикл? есть этому логическое объяснение? в случае если язык - не си, то такое объяснение можно объяснить что тип int - не тот, что в си.

    Korben_Dallas имел ввиду что в какой-то момент i станет равен INT_MAX, и если после этого сделать i++ то это и будет UB. То есть стандартом не гарантируется что при увеличении целого числа INT_MAX на единицу получится отрицательное число. А вы на это полагаетесь только на основании своего опыта.

    По второму вашему примеру нормальный компилятор как минимум выдаст warning.

    НКХЖЕХВ
  • Mahagam Senior Member
    офлайн
    Mahagam Senior Member

    4006

    17 лет на сайте
    пользователь #83779

    Профиль
    Написать сообщение

    4006
    # 12 марта 2018 14:56 Редактировалось Mahagam, 1 раз.

    gooblin, да? читаем что там гыцыцы себе напридумали в правилах
    а напридумали они plus wraps round modulo the width of m. вернее - это не придумано ими, это просто описано существующее поведение железа. большая часть т.н. стандарта - описание поведения железа.

    To a C programmer strong typing means pressing the keys harder
  • Неизвестный кот Senior Member
    офлайн
    Неизвестный кот Senior Member

    12519

    21 год на сайте
    пользователь #6965

    Профиль

    12519
    # 12 марта 2018 14:59

    Mahagam, вы разницу между стандартом языка и его частной реализацией в виде gcc понимаете?

    НКХЖЕХВ
  • Mahagam Senior Member
    офлайн
    Mahagam Senior Member

    4006

    17 лет на сайте
    пользователь #83779

    Профиль
    Написать сообщение

    4006
    # 12 марта 2018 15:10

    gooblin, а у меня как-то вот не получается компилировать и собирать программы с помощью стандарта языка, постоянно приходится пользоваться частными реализациями. а у вас? получается?

    To a C programmer strong typing means pressing the keys harder
  • Неизвестный кот Senior Member
    офлайн
    Неизвестный кот Senior Member

    12519

    21 год на сайте
    пользователь #6965

    Профиль

    12519
    # 12 марта 2018 15:15

    Mahagam, вы путаете теплое с мягким

    НКХЖЕХВ
  • Mahagam Senior Member
    офлайн
    Mahagam Senior Member

    4006

    17 лет на сайте
    пользователь #83779

    Профиль
    Написать сообщение

    4006
    # 12 марта 2018 15:36

    о. что я пропустил!:

    Korben_Dallas:

    Вот также и ваше `int *foo = NULL; (*foo)++;` компиляторы скоро либо просто начнут выкидывать из кода, либо будут назло сегфолтить программу даже на тех платформах, на которых это раньше не сегфолтилось . Чтобы не повадно было.

    вы этот синтаксический сахар, родившийся и устоявшийся на винде, на другие платформы не перекидывайте.

    а ничего, что на некоторых платформах, по этому адресу мапится важная периферия или вообще - память. :trollface:

    в досе там располагались вектора прерываний.
    а в msp430 там и сегодня находится регистр разрешения прерываний.
    в некоторых реализациях ARM7 с нуля начинается флеш (LPC2106 например).

    To a C programmer strong typing means pressing the keys harder