Nano Hash - криптовалюты, майнинг, программирование

C++ Cosine работает без пространства имен std. Почему?

У меня довольно большое приложение, и я работаю без пространства имен std. Я заметил, что не включаю std::cos или std::sin, но получаю правильные результаты. Почему?

Примером урезанного кода может быть:

#include <ctime>
#include <cmath>
#include <iostream>
#include <vector>
//#include <unistd.h>
#include <fstream>
#include <sstream>
#include <iomanip>

using std::cout;
using std::endl;

int main()
{
    double pi = 4*(atan(1));

    cout << "pi = " << pi << endl
         << "cos(pi) = " << cos(pi) << endl
         << "sin(pi) = " << sin(pi) << endl;



    return 0;
}

Я оставил все заголовки, я использую их все в основном коде. Вывод возвращает ~ 3,14, -1 и 1e-16, как и ожидалось. Почему это работает? потому что и грех в std не так ли?

Я использую компилятор g++ на удаленном сервере unix.

Спасибо

03.01.2014


Ответы:


1

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

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

03.01.2014
  • Тот факт, что в некоторых случаях доступны только некоторые перегрузки, является хорошим моментом (о котором я забыл, хотя меня это немного задело). 03.01.2014

  • 2

    Когда вы включаете <cmath>, все функции объявляются в std::. Для заголовков C также существует специальное правило, которое позволяет (но не требует) реализации сделать их видимыми в глобальном пространстве имен; это потому, что большинство реализаций просто адаптируют заголовки C, например:

    #include <math.h>
    namespace std
    {
        using ::sin;
        using ::cos;
        // ...
    }
    

    Это очевидный способ реализовать библиотеку без необходимости переписывать все, просто чтобы она была на C++, и это приведет к тому, что все имена также будут присутствовать в глобальном пространстве имен.

    Формально это функция C++11; до C++11 требовалось, чтобы <cmath> вводил символы только в std::. Практически все или, по крайней мере, большинство реализаций делали что-то подобное вышеописанному и незаконно вводили их в глобальное пространство имен, поэтому C++11 изменил стандарт, чтобы отразить реальность.

    03.01.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..