sqrt(float) 有标准返回类型吗?

2024-01-11

我注意到 appleclang++ (v14.0.0) 在将浮点输入传递给时似乎返回单精度浮点cmath's sqrt。当切换到 gcc/clang 时,我很惊讶地得到了不同的结果。

这是我的最小可重现示例:

#include <cmath>
#include <cstdio>
#include <type_traits>

int main()
{
  float f = 1+1e-7;
  auto X = sqrt(f);
  printf("%16s says X is a %6s with value: %0.17g\n",
#ifdef __clang__
#if defined(__apple_build_version__)
    "appleclang++",
#else
    "clang++",
#endif
#elif __GNUC__
    "g++",
#else
    "unknown compiler",
#endif
    std::is_same<float, decltype(X)>::value ? "float" : "double",
    X);
}

对于不同的编译器我看到:

    appleclang++ says X is a  float with value: 1
         clang++ says X is a double with value: 1.000000059604643
             g++ says X is a double with value: 1.000000059604643

我正在编译-std=c++11 just 为了确定 https://cplusplus.com/reference/cmath/sqrt/.

如果我切换到std::sqrt然后每个人都同意这是一个浮动,但我仍然很好奇。这种行为是否是sqrt确实由编译器决定还是 appleclang 是非标准的?


一般来说,对于大多数数学函数,C++ 标准库对每种浮点类型都有一个重载,该重载采用该类型作为参数并返回相同的类型。此外,还有重载,因此整数参数的行为就像转换为double在通过之前。

然而,这里的问题是你使用sqrt来自全局命名空间范围,这是错误的。它应该是std::sqrt.

当包括<cmath>你只能保证所有的重载std::sqrt中提供了std::命名空间范围。您需要包括<math.h>以保证所有重载在全局命名空间范围内可用,并且您需要同时包含两者以确保所有重载在全局和全局命名空间中都可用std::命名空间范围。顺便说一句,这会影响从 C 派生的所有标准库头。

不过,我建议不要(单独)使用<math.h>头,因为它缺少一些其他特定于 C++ 的数学函数,还因为它自 C++98 以来已被弃用,直到包含 C++20,然后才针对 C++23 弃用。同理其他<_.h>标准库头文件也已被弃用,并且缺少相应部分中包含的某些部分<c_>标头。不幸的是,即使只包含全局名称空间污染,也无法避免<c_>标头。

当包含不匹配时,未指定哪些重载(如果有)将可见,然后有可能不获取float sqrt(float)超载你只能得到double sqrt(double)过载,或与此相关的任何其他过载,例如一个期望int并返回一个double,这会导致非常奇怪的结果。

(虽然最后一个例子有点牵强,因为没有好的实现原因会导致这种行为。实现原因double重载的特殊之处在于它是由底层 C 标准库实现(通常是系统的一部分)提供的,而不是通常在其之上单独构建的 C++ 标准库实现。)

也有可能看不到重载并且程序无法编译。

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

sqrt(float) 有标准返回类型吗? 的相关文章

  • 使用 Enumerable.OfType() 或 LINQ 查找特定类型的所有子控件

    Existed MyControl1 Controls OfType
  • 我如何在 C# .NET(win7 手机)中使用“DataContractJsonSerializer”读入“嵌套”Json 文件?

    我有一个问题 如果我的 json 文件看起来像这样 Numbers 45387 Words 空间桶 我可以很好地阅读它 但是如果它看起来像这样 Main Numbers 45387 Words 空间桶 某事 数字 12345 单词 克兰斯基
  • 防止 boost::asio::io_context 在空轮询调用时停止

    此代码调用发布的句柄 boost asio io context ioc boost asio post ioc std cout lt lt lol lt lt std endl ioc poll 而这并没有 boost asio io
  • 类特定的新删除运算符是否必须声明为静态

    标准中是否要求类特定的 new new delete 和 delete 是静态的 我可以让它们成为非静态成员运算符吗 为什么需要它们是静态的 它们被隐式声明为静态 即使您没有键入 static
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 如何在 SqlDataReader.Read() 期间从死锁异常中恢复

    我的 NET 应用程序的事件日志显示 它在从 Sql Server 读取数据时偶尔会出现死锁 这种情况通常非常罕见 因为我们已经优化了查询以避免死锁 但有时仍然会发生 过去 我们在调用ExecuteReader函数在我们的SqlComman
  • 指向特征矩阵的指针数组

    我在代码中使用 Eigen 的 MatrixXd 矩阵 在某个时刻我需要一个 3D 矩阵 由于 Eigen 没有三维矩阵类型 因为它仅针对线性代数进行了优化 因此我创建了一个 MatrixXd 类型的指针数组 Eigen MatrixXd
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • 从 WebBrowser 控件 C# 获取滚动值

    我试图在 WebBrowser 控件中获取网页的 Y 滚动索引 但无法访问内置滚动条的值 有任何想法吗 对于标准模式下的 IE 使用文档类型 正如你所说 scrollTop是的财产元素 而不是 HtmlDocument htmlDoc th
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • 如何在服务器端按钮点击时关闭当前标签页?

    我尝试在确认后关闭当前选项卡 因此我将以下代码放在确认按钮的末尾 但选项卡没有关闭 string jScript ClientScript RegisterClientScriptBlock this GetType keyClientBl
  • 给出 5 个参数,但在终端中只得到 3 个参数

    我想将一个文件传递给一个c 程序 如果我在 IDE 中执行此操作 test string string lt test txt return argc 5 但在终端上我刚刚得到argc 3 看来 这是因为 什么是 lt 意思是 我正在使用
  • AES 输出是否小于输入?

    我想加密一个字符串并将其嵌入到 URL 中 因此我想确保加密的输出不大于输入 AES 是可行的方法吗 不可能创建任何始终会创建比输入更小的输出的算法 但可以将任何输出反转回输入 如果您允许 不大于输入 那么基本上您只是在谈论同构算法alwa
  • 将标量添加到特征矩阵(向量)

    我刚刚开始使用 Eigen 库 无法理解如何向所有矩阵成员添加标量值 假设我有一个矩阵 Eigen Matrix3Xf mtx Eigen Matrix3Xf Ones 3 4 mtx mtx 1 main cxx 104 13 error
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • 每个数据库多个/单个 *.edmx 文件

    我有一个通过 ADO net 数据服务与数据库交互的项目 数据库很大 近 150 个具有依赖关系的表 该项目几年前开始 当时使用的是数据集 现在我们正在转向实体模型关系 由于我们添加了更多需要使用的表 该模型正在不断增长 这是管理这一切的正
  • 更改 Windows Phone 系统托盘颜色

    有没有办法将 Windows Phone 上的系统托盘颜色从黑色更改为白色 我的应用程序有白色背景 所以我希望系统托盘也是白色的 您可以在页面 XAML 中执行此操作
  • C++ Streambuf 方法可以抛出异常吗?

    我正在尝试找到一种方法来获取读取或写入流的字符数 即使存在错误并且读 写结束时间较短 该方法也是可靠的 我正在做这样的事情 return stream rdbuf gt sputn buffer buffer size 但如果streamb
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte

随机推荐

  • Hadoop Nodemanager 和 Resourcemanager 未启动

    我正在尝试在 Ubuntu 13 10 64 位上设置最新的 Hadoop 2 2 单节点集群 操作系统是全新安装的 我尝试过使用 java 6 64 位和 java 7 64 位 按照以下步骤操作后this http raseshmori
  • PHP - Strtotime - 添加时间

    我有这个变量 timestamp strftime Y m d h M S a time 我只是想增加三个小时并重复它 我已经看到了可以执行 60 60 3 方法或硬编码 3 小时 的方法 它可以理解这些单词 获得这个结果的最佳方法是什么
  • 在 ASP.NET Web API 控制器的 nunit 测试中实例化新的 System.Web.Http.OData.Query.ODataQueryOptions

    我有一个 ASP NET MVC4 Web API 项目 其中包含 ApiController 继承控制器 该控制器接受 ODataQueryOptions 参数作为其输入之一 我正在使用 NUnit 和 Moq 来测试该项目 这使我能够从
  • midi 文件解析,无法识别的事件类型

    我在尝试解析 MIDI 文件时遇到问题 我正在尝试解析 frets on fire 游戏使用的注释文件 它只使用 midi 文件 所以我认为这无关紧要 如果你们中的任何人熟悉它 我遇到的问题是一般的 midi 问题 我有一个文件 其中有一个
  • 我需要一个不会弄乱我打开的窗口的消息泵

    我的应用程序 我正在开发的安装程序的引导应用程序 需要启动一些其他应用程序 我的安装程序和满足安装程序先决条件的第三方安装程序 并等待它们完成 为了允许 GUI 进行屏幕更新在等待应用程序完成时 我使用有关空闲循环处理的 Visual St
  • Node.js 在 for 循环中调用回调函数

    我试图在 a 中调用一个函数for循环 问题是该函数在循环完成后被调用 以下面为例 它打印到控制台 here1 here1 here2 here2 代替 here1 here2 here1 here2 report forEach item
  • LINQ Lambda 连接错误 - 无法从使用情况推断

    我在加入两个 DbSet 时遇到问题 并继续收到 无法推断错误 我努力寻找解决方案 所以我想我会分享我的简单答案 乔恩 斯基特 Jon Skeet 和其他人发表了几篇很棒的帖子 但大多数答案都超出了我的理解范围 这是给我带来麻烦的代码 us
  • Rails 在新控制器中结合 RESTful 方法

    我有一个 Rails 应用程序 其中users create projects 目前 这些是嵌套的 并作为单独的操作完成 Auser寄存器 然后从project仪表板创建一个新的project 为了提高转化率 以及跟踪来自 adwords
  • PySpark - 将单个整数列表与列表列进行比较

    我正在尝试检查 Spark 数据帧 带有列表的列 中的哪些条目包含给定列表中最大数量的值 我想出的最好的方法是迭代数据框rdd foreach 并使用 python 比较给定列表与每个条目set1 intersection set2 我的问
  • ??空合并运算符 --> 合并是什么意思?

    我很想撒谎说英语是我的第二语言 但事实是我只是不知道 合并 是什么意思 我知道什么 在 C 中是 does 但这个名字对我来说没有意义 我查了一下这个词 我知道它是 加入 的同义词 空连接运算符 仍然没有意义 有人可以启发我吗 我很想撒谎说
  • 如何使用UIAppearance外观WhenContainedIn:

    我注意到在 iOS5 中我们可以通过以下方式自定义 UIKit 控件UIAppearance我开始使用它 我想用appearanceWhenContainedIn 定制UINavigationBar s tintColor在不同的班级 例如
  • 使用 puppeteer 和 MutationObserver 检测 DOM 更改

    我想检测某些加载页面上的 DOM 更改 例如 本地新闻页面上添加的新文章 并在检测后执行某些操作 发送电子邮件 在此示例中 我尝试检测子节点是否已从父节点 目标 div 节点 添加或删除 并在检测后在控制台中输出某些内容 我需要实现暴露功能
  • 在python中读取大csv文件的行

    我有一个非常大的 csv 文件 无法完全加载到内存中 所以我想一块一块地读取它 将其转换为numpy数组 然后再做一些处理 我已经检查过了 在Python中读取大文件的惰性方法 https stackoverflow com questio
  • 如何在谷歌应用程序引擎(Python)中使用numpy

    根据官方文档 numpy 作为谷歌应用程序引擎中的库支持here https developers google com appengine docs python tools libraries27 经过几次尝试后我无法导入它 有人可以分
  • 如何使用 Matplotlib 在对数刻度上显示次要刻度标签

    有谁知道如何使用 Python Matplotlib 以对数刻度显示次要刻度的标签 您可以使用plt tick params axis y which minor 设置小刻度并使用matplotlib ticker FormatStrFor
  • JSON 服务在失败/错误时应返回什么

    我正在用 C ashx 文件 编写 JSON 服务 成功请求服务后 我会返回一些 JSON 数据 如果请求失败 要么是因为抛出了异常 例如数据库超时 要么是因为请求在某种程度上是错误的 例如作为参数给出了数据库中不存在的 ID 服务应该如何
  • 将 Swagger Java 对象转换为 JSON/YAML

    我需要阅读 修改并重新生成 JSON YAML swagger 文件文档 我已经使用 Swagger Parser 反序列化了一个 JSON 文件 并且有一个 Swagger Java 对象 其中原始 JSON 数据已正确映射 现在 我需要
  • Dynamics CRM 视图中的串联/计算列

    我是 MS Dynamics 的新手 我想知道是否有一种方法可以将列添加到视图中 该视图是其他一些列的串联 例如 Firstname Lastname As Fullname 似乎没有一个明显的 优雅的 解决方案 我看到的所有建议都建议使用
  • 如何替换默认的 SortArgumentResolver

    我需要添加private static final Sort sortById new Sort Sort Direction DESC ID 每一个Pageable 我想 最好的方法是创建装饰器 适配器SortArgumentResolv
  • sqrt(float) 有标准返回类型吗?

    我注意到 appleclang v14 0 0 在将浮点输入传递给时似乎返回单精度浮点cmath s sqrt 当切换到 gcc clang 时 我很惊讶地得到了不同的结果 这是我的最小可重现示例 include