Foreversoft.ru

IT Справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Язык си abs

C # | Метод Math.Abs () | Комплект — 2

В C # Abs () — это метод класса Math, который используется для возврата абсолютного значения указанного числа. Этот метод может быть перегружен путем передачи ему различных типов параметров. Всего в списке перегрузки 7 методов.

Math.abs (Int64)

Этот метод используется для возврата абсолютного значения 64-разрядного целого числа со знаком.

Синтаксис:

Параметр:

val: It is the required number which is greater than Int64.MinValue, but less than or equal to Int64.MaxValue of type System.Int64.

Тип возвращаемого значения : возвращает 64-разрядное целое число со знаком, скажем, r , такое, что 0 ≤ r ≤ Int64.MaxValue .

Исключение: этот метод выдаст OverflowException, если значение val равно Int64.MinValue .

Пример:

// C # Программа для иллюстрации
// Math.Abs (Int64) метод

public static void Main()

// Принимая длинные значения

// используя цикл foreach

foreach ( long value in val)

Console.WriteLine( «Absolute value of <0>= <1>» ,

Выход:

Math.abs (SByte)

Этот метод используется для возврата абсолютного значения 8-разрядного целого числа со знаком.

Синтаксис:

Параметр:

val: It is the required number which is greater than SByte.MinValue, but less than or equal to SByte.MaxValue of type System.SByte.

Тип возвращаемого значения : возвращает 8-разрядное целое число со знаком, скажем, r , такое, что 0 ≤ r ≤ SByte.MaxValue .

Исключение: этот метод выдаст OverflowException, если значение val равно SByte.MinValue .

Пример:

// C # Программа для иллюстрации
// Math.Abs (SByte) метод

public static void Main()

// принимая значения SByte

// используя цикл foreach

foreach ( sbyte value in sb)

Console.WriteLine( «Absolute value of <0>= <1>» ,

Выход:

Math.abs (ка)

Этот метод используется для возврата абсолютного значения числа с плавающей запятой одинарной точности.

Синтаксис:

Параметр:

val: It is the required number which is greater than or equal to Single.MinValue, but less than or equal to MaxValue of type System.Single.

Возвращаемый тип: Возвращает число с плавающей точкой одинарной точности, скажем, r , такое что 0 ≤ r ≤ Single.MaxValue .

Замечания:

  • Если val равен NegativeInfinity или PositiveInfinity , возвращаемое значение будет PositiveInfinity .
  • Если значение val равно NaN, возвращаемое значение будет NaN .

Язык си abs

На этом шаге мы перечислим глобальные математические функции и рассмотрим особенности их использования .

Читать еще:  Логические операции в си шарп

В заголовочных файлах и определяются глобальные математические функции, унаследованные из языка С . Эти функции перечислены в таблицах 1 и 2.

Замечание . По историческим причинам некоторые числовые функции определяются не в , a в файле .

Таблица 1. Функции, определяемые в заголовочном файле
ФункцияОписание
pow()Возведение в степень
ехр()Экспонента
sqrt()Квадратный корень
log()Натуральный логарифм
Iog10()Десятичный логарифм
sin()Синус
cos()Косинус
tan()Тангенс
sinh()Гиперболический синус
cosh()Гиперболический косинус
tanh()Гиперболический тангенс
asin()Арксинус
acos()Арккосинус
atan()Арктангенс
atan2()Арктангенс частного
ceil()Округление вещественного числа вверх до ближайшего целого
floor()Округление вещественного числа вниз до ближайшего целого
fabs()Модуль (абсолютное значение) для типа float
fmod()Остаток после деления
frexp()Преобразование вещественного числа в целую и дробную части
ldexp()Умножение вещественного числа на целую степень 2
modf()Извлечение знаковой целой и дробной частей из вещественного числа

Таблица 2. Функции, определяемые в заголовочном файле
ФункцияОписание
abs()Модуль (абсолютное значение) для типа int
labs()Модуль (абсолютное значение) для типа long
div()Частное и остаток от деления для типа int
ldiv()Частное и остаток от деления для типа long
srand()Инициализация генератора случайных чисел
rand()Получение следующего случайного числа

В языке C++ , в отличие от С , операции могут перегружаться для разных типов, из-за чего некоторые числовые функции С становятся лишними. Например, в С определены функции abs(), labs() и fabs() для вычисления модуля типов int, long и double соответственно. В C++ функция abs() перегружается для различных типов данных, что позволяет использовать ее со всеми типами.

В частности, все математические функции перегружены для вещественных типов float, double и long double . Однако при этом возникает важный побочный эффект: при передаче целого значения выражение становится неоднозначным:

Вместо этого приходится использовать такую запись:

А при использовании переменной нужно писать так:

Читать еще:  C си шарп

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

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

abs против std :: abs, что говорит ссылка?

Осторожно, я говорю о ::abs() не std::abs()

Согласно веб-сайт cplusplus.com , abs должен вести себя по-другому для stdlib. h C версия, если вы включите

Вот выдержка из этой страницы (которая имеет дело с ::abs не std::abs ):

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

Вот мой пример программы:

И вот результат под MSVC 2010:

  • В MSVC 2010 не выводится предупреждение о компиляции, и программа будет компилироваться, даже если вы не включите ни math.h, ни stdlib.h : это похоже на math.h а также stdlib.h всегда включены все, что вы делаете
  • Выход программы: x=-1.5 ax=1.5 (вроде бы правильно по ссылке)

Теперь вот результат под OSX:

  • Предупреждение компиляции не выдается, даже если -Wall флаг (удвоение к int не сигнализируется)! Результат тот же, если заменить g++ от llvm-g++ , Включение math.h или же cmath не требуется для компиляции.
  • Выход программы: x=-1.5 ax=1

И наконец результат под Linux:

  • Программа не будет компилироваться, если stdlib.h не включен (наконец, один компилятор, который не включает stdlib автоматически). Предупреждение о компиляции не выводится при приведении типа double -> int.
  • Выход программы: x=-1.5 ax=1

Нет явного победителя здесь. Я знаю, что очевидный ответ «предпочитаю std::abs в ::abs «, но мне интересно

  • Является ли сайт cplusplus.com прямо здесь, когда он говорит, что abs должен автоматически предоставить двойную версию за пределами std Пространство имен?
  • Все ли компиляторы и их стандартные библиотеки ошибочны здесь, кроме MSVC (хотя он включает math.h тихо)?
Читать еще:  Цвета в паскаль авс

Решение

Официальные ссылки говорят … это беспорядок. Пре-С ++ 11 и С11:

Официально, в том числе ничего не ввел в :: ;
все функции были в std:: , Практически только
export был менее уважаем, и разные компиляторы сделали очень
разные вещи. Если вы включили , ты использовал std::
везде, или то, что вы получили, варьируется от компилятора к компилятору.

C не предоставил никаких перегрузок: abs взял int , и был
объявлено в , fabs взял double , и был
объявлено в ,

Если вы включили в С ++ не понятно что ты
получил, но так как ни один из разработчиков, казалось, не заботился о
стандарт в любом случае (см. первый пункт выше) …

Грубо говоря, либо ты включил и с префиксом
все использует с std:: или вы включили , а также
используемый fabs если вы хотели поддержку с плавающей запятой (и
различные суффиксы для типов, отличных от int или же double ).

C ++ 11 и C11 добавили несколько новых поворотов:

теперь разрешено (но не обязательно) вводить
символы в :: также. Еще одна вещь, которая может варьироваться
в зависимости от реализации. (Целью здесь было сделать
существующие реализации соответствуют.)

C имеет новый заголовок, , который использует магию компилятора для
сделать функции в вести себя так, как будто они
перегружен как в C ++. (Так что это не относится к abs , но только
в fabs .) Этот заголовок был не был добавлен в C ++, для
очевидная причина того, что C ++ не нуждается в магии компилятора для
этот.

В общем, ситуация стала немного хуже, и мой
Рекомендации выше все еще остаются Включить либо а также
и использовать abs / fabs и их производные (например,
labs , fabsf и т. д.) исключительно или включают , а также
использование std::abs исключительно. Что-нибудь еще, и вы столкнетесь с
проблемы переносимости.

Ссылка на основную публикацию
Adblock
detector