floating-point 相关问题

浮点数是实数的近似值,可以表示比整数更大的范围,但使用相同数量的内存,代价是精度较低。如果您的问题是关于小算术错误(例如为什么0.2 + 0.1等于0.300000001?)或十进制转换错误,请在发布之前阅读下面链接的“信息”页面。

为什么 GPS 报告疯狂的经度数字?

我负责维护和开发一个应用程序,该应用程序严重依赖于使用智能手机设备中的 GPS 跟踪用户的驾驶路线。 问题 问题是...

回答 2 投票 0

1e-9 或 -1e9,哪一个是正确的? [已关闭]

我被分配了一些旧代码,当我阅读它时,我注意到它的形式如下: 低位浮动 = 1e-9; 高浮=1e9; 浮动低 B = 1e-9; 浮动高B = 1e9; 浮动低L = 1e-9;...

回答 2 投票 0

为什么carg(-0)返回-pi?

我注意到,在 C 中使用双复数时,当将具有负 0 虚部的实数传递给 carg() 时,会返回 -M_PI,而不是 0 或 M_PI。这是为什么?我发现...

回答 1 投票 0

在两台计算机上使用浮点数的相同代码会给出两种不同的结果

我有一些 C++ 中的图像处理代码,它可以计算梯度并使用霍夫变换算法在其中找到直线。该程序使用浮点进行大部分计算...

回答 7 投票 0

升级 Fortran 编译器后的数值差异(Intel v11.1 至 v13.0)

背景: 我们只是尝试将 Intel Composer 安装从 2011 年升级到 2013 年,但我们发现虽然大多数结果没有变化,但也有一些发生了一些变化,有些变化很大。 ...

回答 1 投票 0

+0.0 和 -0.0 上的哪些运算和函数会给出不同的算术结果?

在 C 语言中,当支持 ±0.0 时,分配给 double 的 -0.0 或 +0.0 通常不会产生算术差异。 尽管它们具有不同的位模式,但算术上比较它们是相等的。 双zp...

回答 4 投票 0

Feldman 的软件假设(“通用数字”)与现有硬件浮点数的速度比较?

Michael Feldman 提议的假设(“通用数字”)实现似乎非常有趣。 有没有人执行过任何基准测试来比较他的实现(在软件中)与

回答 1 投票 0

为什么没有比符号和幅度更好的浮点数表示方法?

我们有整数的 2 补码,它允许我们执行运算而不必担心符号。这对实施层面有很大帮助。 同样,我们有很多浮点数

回答 3 投票 0

在 C 中打印浮点数,同时避免可变参数提升为 double

如何在 C 中打印(即到标准输出)一个浮点数,而不在传递给 printf 时将其提升为双精度? 这里的问题是 C 中的可变参数函数将所有 float 参数提升为 dou...

回答 5 投票 0

如何以最高精度将 uint64_t 转换为 0 到 1 之间的双精度/浮点型 (C++)?

我正在编写一个基于无符号整数的图像类。我目前正在使用 uint8_t 和 uint16_t 缓冲区来处理 8 位和 16 位 RGBA 像素,并且要从 16 位转换为 8 位,我只需采取 t...

回答 3 投票 0

为什么 gcc 将看似相等的浮点值与“-fexcess- precision=standard”进行比较?

看这个片段: int main() { 双 v = 1.1; 返回 v == 1.1; } 在 32 位编译上,如果指定 -fexcess- precision=standard,则该程序返回 0。没有它,程序...

回答 1 投票 0

如何将Python小数四舍五入到小数点后两位?

我有一个Python Decimal(货币金额),我想将其四舍五入到小数点后两位。我尝试使用常规 round() 函数来执行此操作。不幸的是,这会返回一个浮点数,这使得它

回答 8 投票 0

postgresql 舍入一半向下函数

PostgreSQL 中的 round(numeric,integer) 函数仅向上舍入: round(cast (41.0255 as numeric),3) ==> 41.026 因为我们需要一个返回 41.025 的舍入函数并且(非常令人惊讶)...

回答 7 投票 0

Numpy float64 与 Python float

我正在解决 Pandas read_csv 函数中的一些浮点问题。 在我的调查中,我发现了这一点: 在[15]中:a = 5.9975 在[16]中: 输出[16]:5.9975 在[17]中:np.float64(a) 输出[17]:5.

回答 2 投票 0

如何将字符串科学计数法转换为txt文件中的浮点数

我在 .txt 文件中有代码,其中科学记数法值存储为字符串,我试图将它们转换为浮点数,这样我就可以对它们执行计算。然而,当我尝试尝试...

回答 1 投票 0

将浮点值转换为循环范围?

我不确定我是否使用了正确的术语,但有时我发现自己需要以循环方式将浮点值规范化为一个范围。 (这可能很有用,例如,对于......

回答 1 投票 0

如何使用低级运算将浮点数相加?

我的 C++ 代码遇到问题。 我的目标是创建一个将两个浮点数相加的函数,而不使用浮点指令。 我还需要用作低级

回答 1 投票 0

如何将 double 舍入为 int? [重复]

我有一个双精度数(称之为x),本来是55,但实际上存储为54.999999999999943157,我刚刚意识到。 所以当我这样做时 双x = 54.999999999999943157; int y = (int) x; y = 54 相反...

回答 5 投票 0

C++:如何将双精度数舍入为整数? [重复]

我有一个双精度数(称之为x),本来是55,但实际上存储为54.999999999999943157,我刚刚意识到。 所以当我这样做时 双x = 54.999999999999943157; int y = (int) x; y = 54 相反...

回答 5 投票 0

使用快速数学将浮点数解析为 uint64_t 失败

我有一些代码可以解析浮点数,如果可以将数字转换为无符号而不丢失精度,则返回无符号整数: #包括 #包括 我有一些代码可以解析浮点数并返回一个无符号整数(如果该数字可以转换为无符号而不丢失精度): #include <charconv> #include <string_view> #include <stdint.h> uint64_t read_uint(std::string_view num) { double d; auto r = std::from_chars(num.data(), num.data() + num.size(), d); if (r.ec == std::errc() && r.ptr == num.data() + num.size()) { uint64_t u = (uint64_t)d; if (d == u + 0.0) // conversion back to a double produced identical value return u; } return ~0ull; // error, return -1 } 期望是: assert(read_uint("1.0") == 1); assert(read_uint("1.0654553e+07") == 10654553); assert(read_uint("1.1") == ~0ull); // error assert(read_uint("-123") == ~0ull); // error 但是,当以 avx/avx2/avx512 为目标并使用 -fast-math 时,此代码在 x64/x86 优化构建上惨遭失败。具体来说,解析负数失败: assert(read_uint("-123") == ~0llu); 它不是返回 -1,而是实际返回 -123(转换为 uint64_t)。失败的原因是因为转换回 double 来验证结果是否相同会产生不同的结果: uint64_t u = (uint64_t)d; if (d == u + 0.0) // u + 0.0 produces different result return u; 顺便说一句,当瞄准avx512时,投射也会产生不同的价值: uint64_t u = (uint64_t)d; // u might not be exact when targeting avx512 显然,这段代码充满了错误和陷阱,我有一些问题: 有什么问题,有UB吗? (忽略像底层 uint64_t 这样明显的东西可能无法用双精度表示) 为什么uint64_t u = (uint64_t)d用fast-math和avx512产生不同的结果? 为什么u + 0.0用fast-math和avxN产生不同的结果? 这里正确的方法应该是什么? 是否有编译时标志来识别代码中此类可能的情况? 注意,对于 MS 编译器,我没有看到上述任何问题。无论优化、浮点模型或目标架构如何,值始终准确/相同。 顺便说明一下,这并不是产品中使用的确切代码,而是其中的一些摘录。它解析由 Polygon.io json API 返回的数字。也许,他们不小心使用 python 转储了数字,我见过一些情况,其中值是“1.0”、“1.0654553e+07”等,而不是普通整数。到目前为止,作为一个简单的解决方法,我将转换为 uint64_t 更改为: uint64_t u = (uint64_t)fabs(d); 最小示例:https://godbolt.org/z/cKzrK6ven(如果从 clang cmdline 输出中删除 -O2 将会改变) 是的,您的代码有未定义的行为。 N4928 转换 fpint p1 浮点类型的纯右值可以转换为整数类型的纯右值。转换截断; 即小数部分被丢弃。如果无法表示截断值,则行为未定义 在目的地类型中。 截断值为-123,无法在目标类型中表示uint64_t(它只能表示非负值),因此这是未定义的行为。 请注意,无论您使用 C 风格转换 (uint64_t)d 还是 static_cast<uint64_t>(d),这都适用。 确实,将值为 -123 的 integer 类型的值转换为 uint64_t 会产生明确定义的结果(即 2^64 - 123 = 18446744073709551493)。 但这不适用于转换浮点类型的值。

回答 1 投票 0

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.