На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> long double 80 бит (Windows)
    trunc() возвращает целую часть аргумента в математическом смысле, т.е. округляет к -∞. Простой каст к целому отбрасывает дробную, т.е. округляет к 0. Разница будет на отрицательных аргументах.
    XXXX_cast<type>(data) – в частности static_cast<>, всего их четыре разных – это новый стиль преобразования данных, которые в отличие от старого стиля (type)data не только говорит компилятору, что́ ты хочешь получить, но и зачем. Так, static_cast<> показывает, что ты имеешь желание получить данные с другими свойствами, определяемые их новым типом, при этом оставив сами данные иметь то же значение. Например, при касте целого 123 к вещественному 123.0 тебе важно, чтобы новые данные помимо получения новых свойств сохранили своё значение 123. Обычно это означает, что данные при этом сменят репрезентацию, т.к. бинарное представление целого и вещественного 123 сильно отличаются. Но вот если ты имеешь массив символов, а ты хочешь их рассматривать как массив целых, то static_cast<> тебе не поможет. Тебе нужно, оставив репрезентацию данных неизменной, сообщить компилятору, что они уже имеют новые нужные тебе свойства, осталось только лишь сообщить об этом компилятору. Поэтому char* ты должен кастовать к int* посредством reinterpret_cast<>. При этом важно понимать, что обычно репрезентация данных сильно зависит от реализации, а значит при порте этого кода на другую платформу можно сильно ушибиться лбом об стол. Иначе и быть не может, т.е. ты сам создал эту репрезентацию этих своих данных, так что компилятор тут тебя никак не проконтролирует.
    Итп. Суть в том, что сообщая компилятору не только цель, но и намерения, он сможет тебя обезопасить от ошибок. Старый стиль приведения типов этой информации компилятору не давал. К примеру, имея const int* ptr, ты запросто мог написать (long*)ptr, и компилятор молча это слопает, хотя у человека тут возникнет закономерный вопрос "что не так с const". То ли ты ошибся и забыл, что изначальные данные были константными, то ли ошибся и забыл в новом типе const написать, то ли ты не ошибся и в натуре хотел сразу два каста в одном.
    В целом, помимо фактора улучшенной диагностики кода (за малым исключением), что старый, что новый способы не отличаются.

    Добавлено
    Цитата Jin X @
    А зачем мне считать всё в long double, когда у меня вся суть именно в получении целочисленного результата (long long/uint64_t), и только в этом одном месте используется long double? Я бы использовал с удовольствием какой-нибудь llsqrt, принимающий long long, но вроде нет такого...
    Ну значит всё в порядке. Я ж говорю, тебе виднее.
    Что касается C или C++ сигнатур, тут как бы тот же смысл: если ты сменишь тип данных, т.б. их свойства, плюсовый перегруженный синопсис их подхватит и отследит самостоятельно, в крайнем случае ругнётся, а C-шный с префиксами всегда будет брать в том формате, на который единственный и рассчитан. Опять же, вопрос человеческого фактора. Насколько он тебе тут важен, знаешь только ты.
    Сообщение отредактировано: Qraizer -
      Цитата Qraizer @
      trunc() возвращает целую часть аргумента в математическом смысле, т.е. округляет к -∞. Простой каст к целому отбрасывает дробную, т.е. округляет к 0. Разница будет на отрицательных аргументах.
      Нет, ты путаешь trunc с floor (округление к -∞), т.к. trunc округляет к 0 (отбрасывая дробную часть), как и (int). Получается, разница только в типе возвращаемого значения?

      Цитата Qraizer @
      В целом, помимо фактора улучшенной диагностики кода (за малым исключением), что старый, что новый способы не отличаются.
      (int) = static_cast<int>, так?

      Цитата Qraizer @
      т.б.
      Что такое "т.б."? "То бишь"?

      Добавлено
      Насколько вообще дурным тоном считается смешивание в коде синтаксиса/инструментов/функций C и C++ ?
      Скажем, (int) вместо static_cast<int>, printf вместо cout, использование _getch(), malloc и пр.?
        Цитата Jin X @
        Цитата Qraizer @
        trunc() возвращает целую часть аргумента в математическом смысле, т.е. округляет к -∞. Простой каст к целому отбрасывает дробную, т.е. округляет к 0. Разница будет на отрицательных аргументах.
        Нет, ты путаешь trunc с floor (округление к -∞), т.к. trunc округляет к 0 (отбрасывая дробную часть), как и (int). Получается, разница только в типе возвращаемого значения?
        А. Ну да, попутал. Получается, только в типе результата, да.
        Цитата Jin X @
        (int) = static_cast<int>, так?
        Для стандартных типов да. Для пользовательских типов, т.б. классов, это не всегда так.
        Цитата Jin X @
        Что такое "т.б."? "То бишь"?
        Угу :) Ещё есть т.с. – ", так сказать,".
        Цитата Jin X @
        Насколько вообще дурным тоном считается смешивание в коде синтаксиса/инструментов/функций C и C++ ?
        Та как бы пофик, но с нюансами. Библиотека C является частью библиотеки C++, Стандарт это предусматривает, так что в общем не страшно, если вдруг. Но между библиотеками есть отличия, большей частью несущественные. Как бы дань совместимости со старым кодом. Но не более того, так что в новых проектах видеть старый стиль при наличии нового как-то странно. Обычно засилье легаси в новом проекте говорит о небрежности автора, что в некоторых случаях неприятно может сыграть ему в карму.
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0375 ]   [ 17 queries used ]   [ Generated: 28.03.24, 14:47 GMT ]