浮点数是实数的近似值,可以表示比整数更大的范围,但使用相同数量的内存,代价是精度较低。如果您的问题是关于小算术错误(例如为什么0.2 + 0.1等于0.300000001?)或十进制转换错误,请在发布之前阅读下面链接的“信息”页面。
为什么 gcc 将看似相等的浮点值与“-fexcess- precision=standard”进行比较?
看这个片段: int main() { 双 v = 1.1; 返回 v == 1.1; } 在 32 位编译上,如果指定 -fexcess- precision=standard,则该程序返回 0。没有它,程序...
我有一个Python Decimal(货币金额),我想将其四舍五入到小数点后两位。我尝试使用常规 round() 函数来执行此操作。不幸的是,这会返回一个浮点数,这使得它
PostgreSQL 中的 round(numeric,integer) 函数仅向上舍入: round(cast (41.0255 as numeric),3) ==> 41.026 因为我们需要一个返回 41.025 的舍入函数并且(非常令人惊讶)...
我正在解决 Pandas read_csv 函数中的一些浮点问题。 在我的调查中,我发现了这一点: 在[15]中:a = 5.9975 在[16]中: 输出[16]:5.9975 在[17]中:np.float64(a) 输出[17]:5.
我在 .txt 文件中有代码,其中科学记数法值存储为字符串,我试图将它们转换为浮点数,这样我就可以对它们执行计算。然而,当我尝试尝试...
我不确定我是否使用了正确的术语,但有时我发现自己需要以循环方式将浮点值规范化为一个范围。 (这可能很有用,例如,对于......
我的 C++ 代码遇到问题。 我的目标是创建一个将两个浮点数相加的函数,而不使用浮点指令。 我还需要用作低级
我有一个双精度数(称之为x),本来是55,但实际上存储为54.999999999999943157,我刚刚意识到。 所以当我这样做时 双x = 54.999999999999943157; int y = (int) x; y = 54 相反...
我有一个双精度数(称之为x),本来是55,但实际上存储为54.999999999999943157,我刚刚意识到。 所以当我这样做时 双x = 54.999999999999943157; int y = (int) x; y = 54 相反...
我有一些代码可以解析浮点数,如果可以将数字转换为无符号而不丢失精度,则返回无符号整数: #包括 #包括 我有一些代码可以解析浮点数并返回一个无符号整数(如果该数字可以转换为无符号而不丢失精度): #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)。 但这不适用于转换浮点类型的值。
我真的不明白为什么这个比较仍然会评估False,即使它们完全相同。 从十进制导入十进制,获取上下文 getcontext().prec = 10 x1 = 1.1 x2 = 1.0 公关...
__DBL_EPSILON__ 等宏的 GCC 值在哪里定义?
我使用 GCC 和 MinGW 作为编译器。我想从一些浮点常量中找到实际值,但它们都被定义为编译器宏。例如:__DBL_EPSILON__、__DBL_MAX__、
我在弹性中遇到映射冲突。有问题的字段需要是浮点数,但它被映射为关键字。 我需要一个可以收获具有该字段的所有索引的查询。我是...
我正在与非规范化数字作斗争。 我知道: 本质上,非规范化浮点数能够表示 可以用以下表示的最小(大小)数字 任意
在真正的浮点运算中,我们有附加符号INF(无穷大)、NAN 和有符号零。对于复杂的算术来说,这更加困难。如果使用“天真的”规则
我正在学习C++,但遇到了一个我不明白的错误。 这是我的源代码,包括评论(我正在学习的个人参考。) #include“stdafx.h” #包括
在Python中,你能在只显示两位小数的情况下获得长小数的全部效用吗?
我有一对盒子。一是针对劳动时间。另一个是劳务费。当您输入工时金额时,它会自动计算并填充人工美元框。当您进入分娩状态时
我正在Python中为包含浮点数的排序列表实现二分搜索算法。然而,由于 prec...
为什么我的 RISC-V FCVT.W.D RTL 实现对于输入 0xC1E0000000000000 返回 0x00000000,而不是 0x80000000?(这是一个极端情况)
我正在调试 RISC-V FCVT.W.D(IEEE 754 格式下的双精度到有符号整型转换)指令的 RTL 实现与其在参考模型中的行为之间的差异...
常量表达式在赋值时需要宽度不匹配。不可合成的 VHDL 代码行
我正在尝试实现一个浮点加法器/减法器。我已经实现了可以工作的代码。当我运行模拟时,它按预期工作。 问题是当我尝试在 Vivado 中合成它时......