- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个函数进行一些数学计算并返回一个 double
.由于 std::exp
,它最终在 Windows 和 Android 下得到不同的结果。实现开始不同(Why do I get platform-specific result for std::exp?)。 e-17 舍入差异得到传播,最终它不仅仅是我得到的舍入差异(结果最终可以将 2.36 更改为 2.47)。当我将结果与一些预期值进行比较时,我希望此函数在所有平台上返回相同的结果。
所以我需要四舍五入我的结果。最简单的解决方案显然是(据我在网上找到的)做 std::ceil(d*std::pow<double>(10,precision))/std::pow<double>(10,precision)
.但是,我觉得根据平台的不同,这仍然会导致不同的结果(而且,很难决定 precision
应该是什么)。
我想知道是否对 double
的最低有效字节进行硬编码可能是一个很好的舍入策略。
这个快速测试似乎表明"is":
#include <iostream>
#include <iomanip>
double roundByCast( double d )
{
double rounded = d;
unsigned char* temp = (unsigned char*) &rounded;
// changing least significant byte to be always the same
temp[0] = 128;
return rounded;
}
void showRoundInfo( double d, double rounded )
{
double diff = std::abs(d-rounded);
std::cout << "cast: " << d << " rounded to " << rounded << " (diff=" << diff << ")" << std::endl;
}
void roundIt( double d )
{
showRoundInfo( d, roundByCast(d) );
}
int main( int argc, char* argv[] )
{
roundIt( 7.87234042553191493141184764681 );
roundIt( 0.000000000000000000000184764681 );
roundIt( 78723404.2553191493141184764681 );
}
这个输出:
cast: 7.87234 rounded to 7.87234 (diff=2.66454e-14)
cast: 1.84765e-22 rounded to 1.84765e-22 (diff=9.87415e-37)
cast: 7.87234e+07 rounded to 7.87234e+07 (diff=4.47035e-07)
我的问题是:
unsigned char* temp = (unsigned char*) &rounded
安全还是这里有未定义的行为,为什么?注意:我知道 float 不准确。请不要标记为重复 Is floating point math broken?或 Why Are Floating Point Numbers Inaccurate? .我明白为什么结果不同,我只是在寻找一种方法让它们在所有目标平台上都相同。
编辑,我可能会重新表述我的问题,因为人们在问为什么我有不同的值(value)观以及为什么我希望它们相同。
假设您得到一个 double
由于特定于平台的实现(如 std::exp
),计算结果可能会不同。如果你想修复那些不同的 double
最终在所有平台上都具有完全相同的内存表示 (1),并且您想尽可能降低精度,那么修复最低有效字节是一种好方法吗? (因为我觉得四舍五入到任意给定的精度可能会丢失比这个技巧更多的信息)。
(1) “相同表示”是指如果将其转换为 std::bitset
,您希望看到所有平台的相同位序列。
最佳答案
不,四舍五入不是消除小错误或保证与错误执行的计算一致的策略。
对于将数字线分成范围的任何切片,您将成功地消除大多数微小的偏差(通过将它们放在同一个桶中并固定到相同的值),但是如果您的原始值对跨越边界。
在您对最低有效字节进行硬编码的特定情况下,非常接近的值
0x1.mmmmmmm100
和
0x1.mmmmmmm0ff
只有一个 ULP 的偏差...但在四舍五入后,它们相差 256 ULP。糟糕!
关于c++ - 硬编码 double 的最低有效字节是一种好的舍入策略吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54256429/
我在 ASP.NET MVC 中有一个发票页面。 我正在计算 GST。 在 javascript 中这是结果。 165.45 * 0.1 = 16.544999999999998 在 C# 中我得到
在 JavaScript 中,我想将其减少到小数点后 5 位。不过,我不能简单地四舍五入并得到 0.03085,我需要进一步查看数字并将所有数字向上舍入,以便得到 0.03086。 输入:0.0308
有人可以解释为什么 R 这样做吗?在整数值上舍入最大值和最小值似乎非常有缺陷。 summary(1:1283932) Min. 1st Qu. Median Mean 3rd Qu.
所以基本上我正在做一个物理实验,在我的表格中,我希望我的数据四舍五入到与误差相同的精度,四舍五入为 1 sig fig。 例如,如果我有以下内容: angle signif(c(1.111,2.22
考虑以下 C# 代码... double x = Math.Round(72.6d, 2, MidpointRounding.ToZero); double y = Math.Round(82.6d,
我正在学习 BigDecimal,我希望它检索我输入的确切数字,以下代码正在处理该数字,我不知道为什么 public static BigDecimal parseFromNumberString(S
double y1 = 0; double y2 = 0; double i = 0.025; double n = 2; double h1 = 2000; double h2 = 4000
所以在下面的一组代码中,出于某种原因我得到了完全错误的答案...... import java.util.*; import java.io.*; import java.lang.*; import
在 Python 中,我想将两个数字相除,如果答案不是整数,我希望将数字四舍五入为上面的数字。 例如 100/30 不是给 33.3 而是给 4。谁能建议如何做到这一点?谢谢。 最佳答案 您可以使用
我需要对一个 float 进行四舍五入。例如 4.00011 。内置函数 round() 总是在数字 > .5 时向上舍入,在 = 0 val *= 10 ** precision r
我的代码: // Convert SATOSHIS to BITCOIN static double SATOSHI2BTC(const uint64_t& value) {
我想让我的 tableView 看起来像这样: 我有问题。只有在我点击单元格后,我的右角才会变圆。当 View 出现时,它看起来像这样: 点击后像这样: 这是我的代码: extension UITab
这个问题在这里已经有了答案: Precision String Format Specifier In Swift (31 个答案) 关闭 8 年前。 除了覆盖当前转换为字符串的方法之外,是否有一种
>>> a = 0.3135 >>> print("%.3f" % a) 0.314 >>> a = 0.3125 >>> print("%.3f" % a) 0.312 >>> 我期待 0.313
我有自动将输入字段加在一起的 javascript 函数,但是添加像 1.35 + 1.35 + 1.35 这样的数字会得到 4.050000000000001 的输出,这只是一个例子。如何将总数四舍
这可能是 x86 FPU 专家的问题: 我正在尝试编写一个生成范围 [min,max] 内的随机浮点值的函数。问题是我的生成器算法(浮点 Mersenne Twister,如果你好奇的话)只返回 [1
我一定错过了一些明显的东西。 select CEILING(85/30) = 2 85/30 = 2.83333 我希望该值为 3。 CEILING 函数不应该为我取整吗? 最佳答案 尝试 SELEC
我有一个关于 eclipse rcp 中的 ctabfolders 的问题。我创建了一个 e4 RCP 应用程序,其中包含一个包含堆栈部分容器的窗口,其中包含一个堆栈。该堆栈包含 1 个部分。在这一部
Closed. This question needs details or clarity。它当前不接受答案。
我读过其他一些帖子,它们似乎对其他人有用,但当我尝试它们时,它们不起作用。我刚刚开始学习Java编程,我似乎不明白如何四舍五入。 我试过了 answer = input * input; answer
我是一名优秀的程序员,十分优秀!