【问题标题】:Double to Float Type Conversion -- Why can't I convert (double)20150813.00 to (float)20150813.00?Double 到 Float 类型转换 -- 为什么我不能将 (double)20150813.00 转换为 (float)20150813.00?
【发布时间】:2015-08-15 09:43:31
【问题描述】:

为什么20150813.00 转换为20150812.00000020150708.000000 正确转换为20150708.000000

代码示例:

#include <stdio.h>
#include <iostream>
int main()
{
        double one_o = 20150813.00;
        double two_o = 20150708.00;
        float one = (double)one_o;
        float two = (double)two_o;
        std::cout << std::fixed << "one_o = " << one_o << " one = " << one << std::endl;
        std::cout << "two_o = " << two_o << " two = " << two << std::endl;
        return 1;
}

输出是--

one_o = 20150813.000000 one = 20150812.000000
two_o = 20150708.000000 two = 20150708.000000

帮我理解 double 到 float 类型的转换!

编辑: std::numeric_limits&lt;float&gt;().max() 报告 340282346638528859811704183484516925440.000000 是存储在 float 中的最大值,这远远超出了我试图存储的范围:

【问题讨论】:

  • 可能数字超过了浮点数的最大大小
  • float max = 340282346638528859811704183484516925440.000000 发现如下: std::cout ().max();仍然不明白这在另一篇文章中是如何回答的..
  • 挑选您最喜欢的语言规范,并查找有关准确性的信息
  • @Amit 这将只引用IEEE-754 规范,因此我们可以避免中间步骤。

标签: c++ floating-point


【解决方案1】:

float 可以存储比20150813 大得多的数字,但它不能精确地存储大整数。

假设使用IEEE 754,单精度float最多可以精确存储224的整数,即16777216。大于它的整数可能会损失一些精度。

【讨论】:

  • 第二个数字很幸运,因为它可以被 4 整除。
猜你喜欢
  • 2018-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多