我正在编写一个只支持32位单精度浮点运算的嵌入式硬件程序.但是,我实现的算法需要64位双精度加法和比较.我试图double使用两个元组的模块来模拟数据类型float.因此,a double d将被模拟为struct包含元组:(float d.hi, float d.low).
使用字典顺序进行比较应该是直截了当的.然而,添加有点棘手,因为我不确定应该使用哪个基数.应该是FLT_MAX吗?我怎样才能检测到携带?
如何才能做到这一点?
编辑(清晰度):我需要额外的有效数字而不是额外的范围.
我的问题是,是否保证所有整数值都具有完美的双重表示.
请考虑以下打印"相同"的代码示例:
// 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)
对于任何架构,任何编译器,任何值a和b?保证这是真的吗?i转换为的任何整数是否double总是表示为i.0000000000000和不表示为,例如,i.000000000001?
我尝试了其他一些数字并且它总是如此,但无法找到关于这是巧合还是设计的任何信息.
注意:这与这个问题(除了语言)不同,因为我添加了两个整数.
是否可以在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?
我在我的应用程序中使用BigDecimal作为我的数字,例如,使用JPA.我对"精确度"和"规模"这两个术语进行了一些研究,但我不明白它们究竟是什么.
任何人都能解释一下BigDecimal值的'precision'和'scale'的含义吗?
@Column(precision = 11, scale = 2)
Run Code Online (Sandbox Code Playgroud)
谢谢!
我正在编写一个应用程序,它读取大型浮点数并使用它们执行一些简单的操作.我正在使用花车,因为我认为它比双打快,但经过一些研究后我发现这个主题有些混乱.任何人都可以详细说明这个吗?
我正在寻找将数字转换为BigDecimal的最佳方法.
这够好吗?
Number number;
BigDecimal big = new BigDecimal(number.toString());
Run Code Online (Sandbox Code Playgroud)
我们可以用这种toString()方法失去精确度吗?
可能重复:
为什么我不能从被分割的两个整数中返回一个双精度数
即使我尝试将输出放入浮点数,我的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) 给定一个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)
随着数量的增加,我在小数位后相应地失去了精度.
double r = 11.631;
double theta = 21.4;
Run Code Online (Sandbox Code Playgroud)
在调试器中,这些显示为11.631000000000000和21.399999618530273.
我怎么能避免这个?
众所周知,在比较浮点值时必须小心.通常,==我们使用一些基于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:似乎我必须添加一些加号信息,所以答案在实践中很有用:我想知道:
这是我在目前的标准草案中找到的唯一相关陈述:
浮点类型的值表示是实现定义的.[注意:本文档对浮点运算的准确性没有要求; 另见[support.limits]. - 结束说明]
那么,这是否意味着甚至"案例a)"是实现定义的?我的意思是,l1==l1绝对是一个浮点运算.那么,如果一个实现是"不准确的",那么可能l1==l1是假的?
我认为这个问题不是重复的浮点数==永远好吗?.这个问题没有解决我提出的任何案件.同一主题,不同的问题.我想特别针对案例a)-d)得到答案,因为我无法在重复的问题中找到答案.
c++ floating-point precision language-lawyer floating-point-comparison