- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
C 和 C++ 提供多种宽度的 float 据类型,但未指定精度。编译器可以自由使用理想化算术来简化表达式,使用 double 来计算 float
值的表达式,或者使用 double 寄存器来保持 float< 的值
变量或公共(public)子表达式。
如果我错了请纠正我是错误的,请参阅编辑,但是将内存中的float
提升到 double 寄存器中甚至是合法的,因此存储一个值然后将其加载回来不一定会截断位。
将数字转换为较低精度的最安全、最便携的方法是什么?理想情况下,它也应该是高效的,在 SSE2 上编译为 cvtsd2ss
。 (因此,虽然 volatile
可能是一个答案,但我更喜欢更好的东西。)
编辑:总结一些评论和发现……
FP_CONTRACT on
。float
使用 double (在 C 或 C++ 中)。但是,某些编译器(尤其是 x86-32 上的 GCC)会非法忘记某些精度转换。
编辑 2:一些人对未能缩小中间结果的一致性表示怀疑。
C11 §5.2.4.2.2/9(与答案中引用的 C99 引用文献相同)具体说明了“删除所有额外的范围和精度”,因为它指定了如何以更宽的精度完成其他计算。在几个符合要求的替代精度中,有一个是“不确定的”,对我来说这意味着没有任何限制。
C11 §7.12.2 和 §6.5/8 定义了 #pragma STDC FP_CONTRACT on
,它使编译器能够尽可能使用无限精度。
The intermediate operations in the contracted expression are evaluated as if to infinite range and precision, while the final operation is rounded to the format determined by the expression evaluation method. A contracted expression might also omit the raising of floating-point exceptions.
C++14 同样明确放弃了对中间结果的有限精度和范围的限制。 N4567 §5/12:
The values of the floating operands and the results of floating expressions may be represented in greater precision and range than that required by the type; the types are not changed thereby.
注意允许恒等式x - x = 0
将a + b - b + c
简化为a + c
不是与使加法可交换或结合相同。 a + b + c
仍然不同于 a + c + b
或 a + (b + c)
,当 CPU提供带有两个加数和一个四舍五入结果的加法。
最佳答案
C99 5.2.4.2.2p8 明确表示
assignment and cast [..] remove all extra range and precision
因此,如果您想将范围和精度限制为 float ,只需转换为 float
,或分配给 float
变量即可。
你甚至可以做类似 (double)((float)d)
的事情(用额外的括号来确保人们正确阅读它),将变量 d
限制为float
精度和范围,然后将其转换回 double
。 (标准 C 编译器不允许对其进行优化,即使 d
是 double
;它必须将精度和范围限制为 float
.)
我已经在实际实现中使用了它,例如Kahan summation algorithm ,它可用于允许 C 编译器进行非常积极的优化,但没有失效的风险。
关于c - 将浮点值舍入为例如单精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40784135/
这个问题已经有答案了: Invalid types 'double [100][double]' for array subscript (3 个回答) 已关闭 6 年前。 我已复制下面的整个代码并在
您有 2 个功能; f(x)= x(((x+1)^(1/2))-(x^(1/2))) g(x)= x/(((x+1)^(1/2))+(x^(1/2))) 哪个更准确? 旁注:如果你能解释为什么,
我正在从事一个关于java的研究项目,其中必须完成一些艰难的计算。然而,我已经完成了大部分工作,但停留在某个点上。我必须计算以下内容: (2.1-2.3) raised to power 0.3. 但
int main() { float x = 50; float y = 1/x; float result = y * x; float test = 41;
有没有安全的方法来可靠地确定整数类型 T可以存储浮点整数值 f (所以 f == floor(f) )没有任何溢出? 请记住,不能保证浮点类型 F与 IEC 559 (IEEE 754) 兼容,并且有
// value will always be in the range of [0.0 - maximum] float obtainRatio(float value, float maximum
就在今天,我遇到了我们正在使用的第三方软件,在他们的示例代码中,有以下内容: // Defined in somewhere.h static const double BAR = 3.14; //
是否有推荐的方法来清除 jQuery Flot 图表?我在 API 引用中找不到任何内容。 最佳答案 “清除”是指“破坏整个图表”还是只是清除数据? 要核对整个图表:$('#canvas_id').e
我正在学习单精度并想了解错误传播。根据this nice website ,加法是一个危险的操作。 所以我编写了一个小的 C 程序来测试错误累积的速度。我不完全确定这是否是一种有效的测试方法。如果是,
我正在尝试查询数据库,我需要获取权重等于 60.5 的客户列表。问题是 60.5 是一个实数,我以前从未在 where 子句中使用实数查询过数据库。 我已经尝试过这个: SELECT Name FRO
这是我的“ProjectEntity”类中的代码部分(我在其中使用 hibernate 进行 SQL 调用) @Column(name = "BUDGET") private float budget
我用 Haskell 编写了一个应用程序,它调用 Z3 求解器来解决一些复杂公式的约束。感谢 Haskell,我可以快速切换正在使用的数据类型。 当使用 SBV 的 AlgReal 类型进行计算时,我
在 C 中 double/float 有一个集合类型说明符:%f %F %g %G %e %E .有什么区别吗 %f和 %F , %g和 %G , %e和 %E ? 根据 printf和 scanf输
我正在开发一个适用于 Android 的可视化应用程序(包括运行 Android 2.2 的旧设备)。 我的应用程序的输入模型包含一个区域,该区域通常由数万个顶点组成。典型模型有 50000-1000
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 6 年前。 Improve this ques
我被要求编写一个程序来查找我大学中两个输入的总和,因此我应该首先检查输入是否有效。 例如,如果我输入 2534.11s35,程序应该检测到它不是该程序的有效输入,因为输入中存在 s。 最佳答案 to
我正在尝试降低 FPGA 的逻辑利用率,但在网上找不到任何好的 float fastpow。我所说的“好”是指充分减少所使用的逻辑。如果我使用双版本我几乎没有什么改进。如果我使用其他依赖日志的 flo
我有一个 128 字节的内存位置。我尝试用从 1...127 开始的数据填充内存。 我需要编写一个代码来获取两个参数,如偏移量、数据类型。根据参数,我需要将内存中的数据转换为提到的特定数据类型。 举个
我希望能够做到以下几点: float func() { if( error ) return InvalidFloatingPointValue; else return 0.0f;
假设我有两个 float ,我想比较它们。如果一个大于另一个,程序应该采用一个 fork。如果情况正好相反,它应该走另一条路。并且它应该做同样的事情,如果被比较的值在一个仍然应该使它比较真实的方向上被
我是一名优秀的程序员,十分优秀!