【问题标题】:Is there any resolution difference?分辨率有区别吗?
【发布时间】:2014-03-30 04:37:14
【问题描述】:

鉴于float Afloat B,两者之间是否有区别:

float C = A * B;

还有:

float D = (float) ( (double)A * (double) B);

【问题讨论】:

  • 两者都不会编译,所以不,没有区别。
  • 您在第二个示例中真的是指大写 F Float 吗?
  • 你为什么不试试看? (忽略大小写,没有分号,让它看起来像伪代码)检查编译器中的每个步骤或打印它们太多了,
  • 简短的回答是肯定的,它可以有所作为,但“多少”的完整答案完全取决于您对结果的处理方式以及您使用的数字类型.
  • 你的意思是float C = (float) A * (float) B;

标签: c++ c numeric numerical-methods


【解决方案1】:

很难解释您的问题。我相信你真的在问,鉴于floats xy

float z = x * y;

在数值上等价于:

float z = (double)x * (double)y;

这个问题不能完全笼统地回答,因为 C 和 C++ 需要很少的类型 floatdouble。然而,如果假设floatdouble 分别是IEEE-754 binary32 和binary64,那么答案是肯定的;两个表达式都只使用一次舍入计算,这是 IEEE-754 要求正确舍入的,因此结果是相同的。

【讨论】:

    【解决方案2】:

    我认为您打算做的是计算 double 精度中的表达式,然后分配给单精度 (float) 变量。

    答案是否定的,“没有区别”,结果不会不同。原因是变量A & B 被定义为float,因此在计算过程中将它们升级为double 并不能提高准确性。如果要提高精度,请将A & B 定义为double。更好的测试是尝试近乎单数的表达式。

    【讨论】:

    • 你的推理是错误的。如果类型是doublelong double 而不是floatdouble,则从double 转换为long double 时不会丢失信息,但在转换@ 时会丢失信息987654336@ 结果从 long doubledouble。最终结果将是“双舍入”(舍入两次),并且不如double d = d1 * d2; 的结果准确。这种差异很少是可见的,但它会存在,也许自相矛盾的是,double 的计算会比long double 更好。
    • @PascalCuoq 争论不是关于精度损失,而是关于两个结果之间是否存在差异。例如,让数字为float x = 3.141592, y = 1.0,现在在计算float z = (float)((double)x * (double)y) 期间将其类型转换为double,将暂时将3.141592 升级为最接近的double,主要通过在末尾填充零。因此结果不会有任何变化。
    • 如果这个答案中的推理是正确的,那么它将适用于doublelong double。从doublelong double 的转换也通过添加零从64 位扩展到80 位并保留该值。但是,0x1.39d6f77f65b98p+62*0x1.4b94b1e48fe65p+58=0x1.967f3c5ea32a9p+120 但是(双)((长双)0x1.39d6f77f65b98p+62 * 0x1.4b94b1e48fe65p+58)ea=3xa+1。这说明这个答案的推理是不正确的。
    • (float)((double)floatA * (double)floatB) 等于 floatA * floatB 的属性成立的原因比此答案中所述的更复杂,这些原因不适用于 doublelong double
    • @PascalCuoq 我认为您在这里忽略了一点,即您所说的额外准确性是错误的!当我们定义一个变量值说x = 2.0时,它并没有准确地存储为 2.0。它可以存储为 2.0000001 或 1.999999。当我们通过类型转换将精度float 增加到double(或doublelong double)时,会发生同样的事情,额外的零被填充,但由于二进制数字的精确表示是不可能的数字的最佳表示。因此,额外的信息是由于转换导致的错误,而不是准确性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多