问题标签 [math.h]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
iphone - 为什么这段代码有时会返回 NaN?
这通常会根据输入返回 NAN(“非数字”):
我尝试将 PI 缩小几位数,看看是否有帮助。没有骰子。然后我认为这可能是数据类型不匹配,但float和glfloat似乎是等价的:
gl.h
数学.h
这是选角问题吗?
c++ - 我什么时候使用 fabs,什么时候使用 std::abs 就足够了?
我假设abs
并且fabs
在使用math.h
. 但是当我只使用cmath
and时std::abs
,我必须使用std::fabs
orfabs
吗?还是没有定义?
c - sqrt() 函数不适用于可变参数
我不知道我是否遗漏了一些明显的东西,但似乎我无法计算 C 中变量的平方根;sqrt() 函数似乎只适用于常量。这是我的代码:
当我运行这个程序时,我收到以下错误:
但是,如果我将 sqrt() 中的参数替换为常数,例如 2.0,例如 ( b = sqrt(2.0)
),那么它可以正常工作。sqrt() 不应该与变量或其他东西一起使用吗?
谢谢您的帮助
c - 寻找纯 c 版本的 math.h 函数(无协处理器支持)
我必须使用一些静态处理 C 源代码的(半)自动验证软件(CBMC (链接) )。支持浮点,但没有所有数学函数的定义。尝试检查是否可以用它检查数字软件。
所以我需要这些功能。我正在寻找一些math.h
不使用协处理器的定义(例如sqrt
,、、pow
余数、tan
;int
// float
)double
。
当我在一些 linux 发行版(可能是现在的 eglibc)附带的 libc 中寻找它时,我总是达到一个点,其中有一些处理器内在特性,例如硬件 sqrt 函数。
第 1 部分:搜索软件实现
我需要的是一个支持具有以下特征的数学函数的库:
- 支持 IEEE 浮点数,但纯粹基于整数运行的库也会很棒,也许更好。
- 正确性是一个关键因素。(隐藏在某些来源中的特殊情况的已知错误并不那么酷)。根据 IEEE-754(例如 sqrt 规则),结果也应该是正确的。
- 不使用协处理器调用。纯软件。C 是首选,但 asm 也应该没问题。
到目前为止,我搜索了一些 libc 实现,尤其是关于嵌入式系统的实现。我认为这些库中的大多数都针对已编译程序的可移植性和大小,但很难判断它们是否使用了特定于处理器的指令。
- ** fdlibm 乍一看似乎有一些纯软件定义。我将进一步检查。但是源代码中提到了一些错误(代码不是标准的)。
- ** newlib似乎带来了相同的定义(基于 sun 微系统的代码)。但目前我不能确定是否始终使用这些软件版本,因此可能有一些我目前看不到的协处理器调用(见第 2 部分)。
- ** uClibc似乎与 newlib 共享该特性。
第 2 部分:了解这些实现的结构
有人能给我简要介绍一下这些数学库的结构吗?他们如何分派各种版本(例如特定的协处理器)?
文件名中这些不同前缀的含义是什么。
e_sqrt.c
,k_sin
,s_sin
?
我很高兴听到一些对我有用的库。我更喜欢自带库,但有必要的时候,也可以找一些单一的函数实现,搭建一个小库。我不会使用 math.h 中定义的所有函数。
这个和这个SO-posts 说 Java 数学实现是/是基于fdlibm的,这听起来这个库是要走的路。我应该知道有关此库的更多信息的人吗?
似乎我有很多可能性,包括以下两种:
- 使用 glibc 并在软件模式下编译。问题是,我不能使用任何自动系统检查工具(在配置中)。我必须手动提供所有信息。是否有任何标志禁止使用 fp 协处理器和禁止 simd 操作?fp-without 应该是一个开始,然后如果它编译它也使用软浮点。我希望编译过程或多或少取决于主机的特定决定(如 arm ...)。
- 使用 fdlibm(目前首选)。问题:如何将我的程序链接到它?我需要像 assert 这样的非 libm 函数,但想要链接到我的 fdlibm 而不是已安装的 system-libm(因此 -nodefaultlibs 将禁止使用 assert)。
c - 如何解释反三角(和 sqrt)函数(在 C 中)的浮点算术中的舍入误差?
我有一个相当复杂的函数,它需要几个 double 值,它们代表 3 空间中的两个向量(幅度、纬度、经度),其中纬度和经度以弧度和角度表示。该函数的目的是将第一个向量围绕第二个向量旋转指定的角度并返回结果向量。我已经验证了代码在逻辑上是正确的并且有效。
该函数的预期用途是用于图形,因此不需要双精度;但是,在目标平台上,采用浮点数(特别是sinf、cosf、atan2f、asinf、acosf 和 sqrtf)的 trig(和 sqrt)函数在双精度数上的工作速度比在浮点数上更快(可能是因为计算这些值的指令实际上可能需要double;如果传递了一个浮点数,则该值必须强制转换为双精度数,这需要将其复制到具有更多内存的区域——即开销)。结果,函数中涉及的所有变量都是双精度的。
这是问题所在:我正在尝试优化我的功能,以便每秒可以调用更多次。因此,我用对这些函数的浮点版本的调用替换了对 sin、cos、sqrt 等的调用,因为它们导致整体速度提高了 3-4 倍。这适用于几乎所有输入;但是,如果输入向量与标准单位向量(i、j 或 k)接近平行,则各种函数的舍入误差会累积到足以导致稍后调用 sqrtf 或逆触发函数(asinf、acosf、 atan2f) 来传递刚刚超出这些函数域的参数。
所以,我陷入了两难境地:要么我只能调用双精度函数并避免这个问题(最终限制为每秒大约 1,300,000 次向量操作),要么我可以尝试提出其他方法。最终,我想要一种方法来清理逆触发函数的输入以处理边缘情况(对于 sqrt 来说这样做很简单:只需使用 abs)。分支不是一种选择,因为即使是单个条件语句也会增加太多开销,以至于失去任何性能提升。
那么,有什么想法吗?
编辑:有人对我使用双精度和浮点运算表示困惑。如果我将所有值实际存储在双倍大小的容器(即双类型变量)中,则该函数比将它们存储在浮点大小的容器中要快得多。但是,出于显而易见的原因,浮点精度三角运算比双精度三角运算更快。
c - 使用 pow() 函数在 C 中引发未定义的引用错误
为什么以下代码在 C 中有效:
而另一个没有?
即使我尝试
我得到一个
未定义对“pow”的引用
我究竟做错了什么?
c++ - 在 C++ 中找到立方根?
当我试图找到一个数字的立方根时,会发生奇怪的事情。
以下代码返回我未定义。在 cmd 中:-1.#IND
虽然这个工作得很好。在 cmd 中:4.93242414866094
从数学方式来看,它必须有效,因为我们可以从负数获得立方根。Pow 来自 Visual C++ 2010 math.h 库。有任何想法吗?
c - 如何刷新文件 math.h
你好,我在 C (gcc) 中有一个问题,当我编译一个包含 Math.h 并从那里使用函数的程序时,它说“未定义的引用...”。它发生在 sqrt、log 上,但对于其他人则不会(例如 pow)。如何修复此库或重新安装它?提前致谢。[我正在使用 Ubuntu]
visual-studio-2005 - 如何在 MS-VS 2005 编译器项目设置中包含数学库?
我正在尝试构建一个最初使用 gcc -lm ... 选项在 Linux 上构建的 C 程序,它在链接代码时使用数学库。如何在 Win32 环境下的 Visual Studio 2005 编译器的项目设置中使用相同的设置?
编辑:基本上原始 Linux 代码包括 math.h 并使用 gcc -lm 链接数学库。但是当我在 Windows 中使用它时,我得到一个编译错误:NAN :- undeclared identifier
.
我正在寻求解决这个问题。
windows - linux上函数nanf()的定义在哪里
我正在尝试查找函数 nanf() - return 'Not a Number function 的定义和声明,这与 Linux gcc 编译器环境 (glibc) 上的浮点功能有关。
我需要在 Windows 上对 nanf() 使用类似/相同的定义来使用 Visual Studio 构建我的代码。
我检查了 Linux src/include 文件夹中的以下头文件,但没有看到任何与 nanf 声明相关的内容。
/usr/include/math.h /usr/include/bits/nan.h
任何指针都会有所帮助。
谢谢你,
-广告