【发布时间】:2020-09-24 07:18:39
【问题描述】:
我有一个函数,它需要两个字符串(浮点),运算和浮点位宽:
EvaluateFloat(const string &str1, const string &str2, enum operation/*add,subtract, multiply,div*/, unsigned int bit-width, string &output)
输入 str1 和 str2 可以是 float(32 位)或 double(64 位)。
如果将输入存储为双精度并执行双精度操作而不考虑位宽并且取决于位宽类型转换它是否为 32 位,是否可以。 例如
double num1 = atof(str1);
double num2 = atof(str2);
double result = num1 operation num2; //! operation will resolved using switch
if(32 == bit-width)
{
float f_result = result;
output = std::to_string(f_result);
}
else
{
output = std::to_string(result);
}
如果我使用浮点类型执行浮点操作,我可以安全地假设 f_result 将完全相同,即
float f_num1 = num1;
float f_num2 = num2;
float f_result = f_num1 operation f_num2
PS:
- 我们假设不会有任何级联操作,即 out = a + b + c 相反,它将转换为: temp = a +b out = temp + c
- 我不关心 inf 和 nan 值。
- 我正在尝试编码冗余,否则我有两个执行相同的操作 两次浮动一次,其他两次两次
【问题讨论】:
-
double的精度不低于float,float可以表示的值集是double可以表示的值集的严格子集。因此,从float到double的转换没有潜在的精度损失,但是会转换回来。如果您只使用floats 进行操作,您可能会得到不同的结果。这些情况并不表明您通过使用double进行操作而失去了精度 - 这意味着您获得的精度比仅在floats 上进行操作所获得的精度更高,但比使用@ 做所有事情要少987654333@s. -
谢谢彼得。可能是我错误地提出了我的问题,我们是一个等价检查工具,所以我们需要根据语言语义匹配任何结果。
-
你给我们的信息太少了,看你为什么想做,你做什么。就我而言,我真的不明白为什么会有刺痛,当你在花车上操作时。尽管如此。当你的操作都是双倍并返回一个浮点数时,你肯定会得到不同的结果。与对浮点数的操作相比并返回浮点数。不仅在精度上,结果也会不同,因为 float 不如 double 精确,因此操作会有所不同。你无法比较结果并获得匹配。你必须实现一个带有增量的比较函数,然后你将创建匹配项。
-
@skratchi.at 我们是一个等价检查工具,所以我们需要根据语言语义匹配任何结果。
-
你确定
str1和str2有准确的float表示吗?例如,像 0.1 这样的“简单”数字没有。在您的“PS 3”中:为什么不编写模板方法?
标签: c++ casting floating-point