标签: precision

使用2"浮动"模拟"双"

我正在编写一个只支持32位单精度浮点运算的嵌入式硬件程序.但是,我实现的算法需要64位双精度加法和比较.我试图double使用两个元组的模块来模拟数据类型float.因此,a double d将被模拟为struct包含元组:(float d.hi, float d.low).

使用字典顺序进行比较应该是直截了当的.然而,添加有点棘手,因为我不确定应该使用哪个基数.应该是FLT_MAX吗?我怎样才能检测到携带?

如何才能做到这一点?


编辑(清晰度):我需要额外的有效数字而不是额外的范围.

c c++ algorithm floating-point precision

58
推荐指数
5
解决办法
9907
查看次数

所有整数值都完美地表示为双精度数吗?

我的问题是,是否保证所有整数值都具有完美的双重表示.

请考虑以下打印"相同"的代码示例:

// Example program
#include <iostream>
#include <string>

int main()
{
  int a = 3;
  int b = 4;
  double d_a(a);
  double d_b(b);

  double int_sum = a + b;
  double d_sum = d_a + d_b;

  if (double(int_sum) == d_sum)
  {
      std::cout << "Same" << std::endl;
  }
}
Run Code Online (Sandbox Code Playgroud)

对于任何架构,任何编译器,任何值ab?保证这是真的吗?i转换为的任何整数是否double总是表示为i.0000000000000和不表示为,例如,i.000000000001

我尝试了其他一些数字并且它总是如此,但无法找到关于这是巧合还是设计的任何信息.

注意:这与这个问题(除了语言)不同,因为我添加了两个整数.

c++ precision double standards ieee-754

57
推荐指数
3
解决办法
8693
查看次数

在Ruby中设置float的显示精度

是否可以在Ruby中设置float的显示精度?

就像是:

z = 1/3
z.to_s    #=> 0.33333333333333
z.to_s(3) #=> 0.333
z.to_s(5) #=> 0.33333
Run Code Online (Sandbox Code Playgroud)

或者我必须覆盖to_s方法Float

ruby floating-point precision

55
推荐指数
4
解决办法
7万
查看次数

BigDecimal,精度和规模

我在我的应用程序中使用BigDecimal作为我的数字,例如,使用JPA.我对"精确度"和"规模"这两个术语进行了一些研究,但我不明白它们究竟是什么.

任何人都能解释一下BigDecimal值的'precision'和'scale'的含义吗?

@Column(precision = 11, scale = 2)
Run Code Online (Sandbox Code Playgroud)

谢谢!

java precision jpa scale bigdecimal

55
推荐指数
3
解决办法
5万
查看次数

比C#中的浮点数快一倍?

我正在编写一个应用程序,它读取大型浮点数并使用它们执行一些简单的操作.我正在使用花车,因为我认为它比双打快,但经过一些研究后我发现这个主题有些混乱.任何人都可以详细说明这个吗?

c# floating-point precision performance

53
推荐指数
6
解决办法
2万
查看次数

将Java Number转换为BigDecimal:最好的方法

我正在寻找将数字转换为BigDecimal的最佳方法.

这够好吗?

Number number;
BigDecimal big = new BigDecimal(number.toString());
Run Code Online (Sandbox Code Playgroud)

我们可以用这种toString()方法失去精确度吗?

java precision numbers bigdecimal

52
推荐指数
2
解决办法
9万
查看次数

除以两个整数以产生浮点结果

可能重复:
为什么我不能从被分割的两个整数中返回一个双精度数

即使我尝试将输出放入浮点数,我的C++程序也会截断整数分割的输出.如何在保持变量(a和b)为整数的同时防止这种情况?

user@box:~/c/precision$ cat precision.cpp
#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
  int a = 10, b = 3;
  float ans = (a/b);
  cout<<fixed<<setprecision(3);
  cout << (a/b) << endl;
  cout << ans << endl;
  return 0;
}

user@box:~/c/precision$ g++ -o precision precision.cpp 
user@box:~/c/precision$ ./precision 
3
3.000
Run Code Online (Sandbox Code Playgroud)

c++ precision integer-division

51
推荐指数
1
解决办法
15万
查看次数

如何在Dart中将双精度舍入到小数点后的给定精度?

给定一个double,我想将它舍入到小数点后的给定数量的精度,类似于PHP的round()函数.

我在Dart文档中找到的最接近的东西是double.toStringAsPrecision(),但这不是我需要的,因为它包括精度总点数小数点之前的数字.

例如,使用toStringAsPrecision(3):

0.123456789 rounds to 0.123  
9.123456789 rounds to 9.12  
98.123456789 rounds to 98.1  
987.123456789 rounds to 987  
9876.123456789 rounds to 9.88e+3
Run Code Online (Sandbox Code Playgroud)

随着数量的增加,我在小数位后相应地失去了精度.

precision double-precision dart

49
推荐指数
15
解决办法
3万
查看次数

为什么我看到一个双变量初始化为某个值,如21.4为21.399999618530273?

double r = 11.631;
double theta = 21.4;
Run Code Online (Sandbox Code Playgroud)

在调试器中,这些显示为11.63100000000000021.399999618530273.

我怎么能避免这个?

floating-point precision

46
推荐指数
5
解决办法
2万
查看次数

浮点平等

众所周知,在比较浮点值时必须小心.通常,==我们使用一些基于epsilon或ULP的相等测试来代替使用.

但是,我想知道,有什么案例,使用时==完全没问题吗?

看看这个简单的片段,哪些案例可以保证成功?

void fn(float a, float b) {
    float l1 = a/b;
    float l2 = a/b;

    if (l1==l1) { }        // case a)
    if (l1==l2) { }        // case b)
    if (l1==a/b) { }       // case c)
    if (l1==5.0f/3.0f) { } // case d)
}

int main() {
    fn(5.0f, 3.0f);
}
Run Code Online (Sandbox Code Playgroud)

注意:我已经检查了这个这个,但它们不包括(全部)我的情况.

注2:似乎我必须添加一些加号信息,所以答案在实践中很有用:我想知道:

  • C++标准说的是什么
  • 如果C++实现遵循IEEE-754会发生什么

这是我在目前的标准草案中找到的唯一相关陈述:

浮点类型的值表示是实现定义的.[注意:本文档对浮点运算的准确性没有要求; 另见[support.limits]. - 结束说明]

那么,这是否意味着甚至"案例a)"是实现定义的?我的意思是,l1==l1绝对是一个浮点运算.那么,如果一个实现是"不准确的",那么可能l1==l1是假的?


我认为这个问题不是重复的浮点数==永远好吗?.这个问题没有解决我提出的任何案件.同一主题,不同的问题.我想特别针对案例a)-d)得到答案,因为我无法在重复的问题中找到答案.

c++ floating-point precision language-lawyer floating-point-comparison

46
推荐指数
3
解决办法
3391
查看次数