关于 std::abs 函数

2023-12-20

Is the std::abs()为 C++11 中的所有算术类型明确定义的函数,并将返回|x|没有近似问题吗?

奇怪的是,对于 g++4.7,std::abs(char), std::abs(short int), std::abs(int), std::abs(long int) and std::abs(long long int)似乎返回一个双精度(与以下相反:http://en.cppreference.com/w/cpp/numeric/math/abs http://en.cppreference.com/w/cpp/numeric/math/abs)。如果数字被转换为双精度数,对于非常大的数字,我们可能会出现一些近似误差(例如-9223372036854775806LL = 2^63-3).

那么我有保证吗std::abs(x)总会回来的|x|对于所有算术类型 ?

编辑:这是一个进行一些测试的示例程序

#include <iostream>
#include <iomanip>
#include <cmath>
#include <typeinfo>

template<typename T>
void abstest(T x)
{
    static const unsigned int width = 16;
    const T val = x;
    if (sizeof(val) == 1) {
        std::cout<<std::setw(width)<<static_cast<int>(val)<<" ";
        std::cout<<std::setw(width)<<static_cast<int>(std::abs(val))<<" ";
    } else {
        std::cout<<std::setw(width)<<val<<" ";
        std::cout<<std::setw(width)<<static_cast<T>(std::abs(val))<<" ";
    }
    std::cout<<std::setw(width)<<sizeof(val)<<" ";
    std::cout<<std::setw(width)<<sizeof(std::abs(val))<<" ";
    std::cout<<std::setw(width)<<typeid(val).name()<<" ";
    std::cout<<std::setw(width)<<typeid(std::abs(val)).name()<<std::endl;
}

int main()
{
    double ref = -100000000000;
    abstest<char>(ref);
    abstest<short int>(ref);
    abstest<int>(ref);
    abstest<long int>(ref);
    abstest<long long int>(ref);
    abstest<signed char>(ref);
    abstest<signed short int>(ref);
    abstest<signed int>(ref);
    abstest<signed long int>(ref);
    abstest<signed long long int>(ref);
    abstest<unsigned char>(ref);
    abstest<unsigned short int>(ref);
    abstest<unsigned int>(ref);
    abstest<unsigned long int>(ref);
    abstest<unsigned long long int>(ref);
    abstest<float>(ref);
    abstest<double>(ref);
    abstest<long double>(ref);
    return 0;
}

保证存在正确的重载<cmath>/<cstdlib>:

C++11,[c.math]:

除了int某些数学函数的版本<cstdlib>, C++ 添加long and long long这些函数的重载版本,具有相同的语义。

添加的签名是:

long abs(long);            // labs()
long long abs(long long);  // llabs()

[...]

除了double数学函数的版本<cmath>,这些函数的重载版本,具有相同的语义。 C++ 添加float and long double这些函数的重载版本,具有相同的语义。

float abs(float);
long double abs(long double);

所以你应该确保正确包含<cstdlib> (int, long, long long过载)/<cmath> (double, float, long double过载)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于 std::abs 函数 的相关文章

随机推荐

  • Meteor 路由错误:路径没有路由:/

    我已将 Meteor 更新为 Meteor 1 3 2 4 并面对这个问题 我还更新了所有软件包的最新版本 错误 路径没有路由 我在两种环境中都尝试了 meteor and 流星跑 制作 控制台中将显示相同的错误 我已经安装了以下软件包 a
  • 从 Ktor 应用程序发送电子邮件

    我目前正在使用 Ktor Netty 引擎创建我的应用程序 我在文档中搜索了当用户向我的服务器发送请求时处理发送电子邮件的任何功能 但什么也没找到 post api v1 auth TODO send email when request
  • jsf导航问题

    我有一个带有 查看用户 页面的 JSF2 项目 该页面从会话 bean 读取当前选定的用户 userHandler selectedUser 该页面旨在通过应用程序中的链接导航来访问 但是 如果用户尝试通过此 URL 直接访问 查看用户 页
  • Bootstrap 3页打印手机版

    当我们从基于 Bootstrap 3 的网站打印页面时 它们会在某些显示移动版本的浏览器上打印 我用谷歌搜索试图找到一个好的解决方案 但没有真正找到任何有效的解决方案 在屏幕上使用相同的 CSS 并将 打印隐藏 类添加到特定的 DIV 中
  • 如果我在 WRITE_EXTERNAL_STORAGE 权限中设置 maxSdkVersion,为什么我的地图应用程序会崩溃?

    我已按照中的说明设置了地图这个链接 https developers google com maps documentation android start getting the google maps android api v2 并设
  • 为什么下标运算符 C++ 经常成对出现?

    C FAQ http www parashift com c faq multidim arrays3 html正在定义一个模板容器Matrix以避免棘手new delete代码 教程说下标运算符通常成对出现 为什么会这样呢 T opera
  • 安装后无法导入lightgbm

    我的操作系统是 macOS Sierra 10 12 5 我使用的是 Anaconda 和 python 2 7 安装后 当我尝试时 将 lightgbm 导入为 lgb 我收到以下消息 OSError Traceback most rec
  • 重复JS函数

    我试图让这个函数在它的周期结束时重复 我尝试将函数分配给变量并在回调中调用该变量 但失败了 我尝试将这个函数包装在setInterval功能 仍然无法使其工作 如何让这个函数运行无限循环并重复自身 span text change type
  • 将指针与负值进行比较

    我可以将指向结构的指针强制转换为有符号值以返回不同类型的错误吗 C 标准是否允许这样做或者是未定义的行为 typedef enum lError l OK 0 l ERROR 1 l ABORT 2 l HALT 3 L STATUS ty
  • 如何在javascript中从数组中删除重复的对象?

    在我的代码中 我创建了一个名为 array1 的数组 在这个数组中我列出了多个对象 我想过滤掉 array1 对象值作为唯一 并且需要将 id 与其各自的值分组 我在这里添加了我的代码 Array1 var array1 value A i
  • 如何将本地 html 文件加载到 Jsoup 中?

    我似乎无法使用 Jsoup 库加载本地 html 文件 或者至少它似乎没有意识到这一点 我在本地文件中硬编码了确切的 html 作为 var html 当我切换到该文件而不是文件输入时 代码完美运行 但两次都会读取该文件 import ja
  • 向后读取文件(最后一行在前)

    文件看起来像这样 abcd efgh ijkl 我想使用读取文件C这样它首先读取最后一行 ijkl efgh abcd 我似乎找不到不使用的解决方案array用于存储 请帮忙 edit0 感谢所有的答案 只是为了让您知道 我是创建此文件的人
  • 如何使用SQL Server的OUTPUT子句进行更新

    DECLARE t2 AS TABLE id INT INSERT INTO dbo EntityMaster EntityType OUTPUT INSERTED EntityId INTO t2 SELECT G FROM tmp tm
  • 无法在 Winforms 中使用 C# 使用 datagridview 添加新行

    我想做一个简单的数据输入应用程序 所以我做了以下事情 创建了一个新的 Windows 窗体应用程序 添加了 DataGridView 添加了一个新的数据源 SQL Express 数据库 有一个包含 3 列的表 id name number
  • Mac/Safari 上的字体粗细变轻

    On my last website the text is perfect naturally on chrome and firefox without touching font smoothing or anything else
  • 使用音轨从线程更新用户界面

    我有一个应用程序 可以使用audiorecord 和audiotrack 来录制音频来播放 我在用户界面中有一个进度条 需要随着曲目的播放而增加 audiotrack api 表示读取和写入方法是阻塞的 这意味着用户界面被冻结直到写入完成
  • 在构建时生成 Nuget 包不包含所有依赖项

    我的解决方案的树如下所示 项目A 引用 Nuget 包 Some Package 项目B 参考文献 项目 A 构建时 项目 B 生成一个包 我们称之为PackageB 在 ProjectB csproj 中我使用了以下内容
  • nltk:如何防止专有名词的词干

    我正在尝试使用斯坦福词性标注器和 NER 编写一个关键字提取程序 对于关键字提取 我只对专有名词感兴趣 这是基本方法 通过删除字母以外的任何内容来清理数据 删除停用词 每个词的词干 确定每个单词的 POS 标签 如果 POS 标签是名词 则
  • Firebase Firestore 模拟器如何工作?

    到目前为止 我一直在使用 Firebase Hosting 和 Functions 模拟器 但现在我正在编写一个基于 Firestore 触发器运行的函数 因此我正在研究 Firestore 模拟器进行开发 但它是如何运作的呢 它完全模仿
  • 关于 std::abs 函数

    Is the std abs 为 C 11 中的所有算术类型明确定义的函数 并将返回 x 没有近似问题吗 奇怪的是 对于 g 4 7 std abs char std abs short int std abs int std abs lo