Aren的6位数保证单精度?

时间:2017-11-06 13:51:52

标签: c++ floating-point

这里是code

class FeedOculosDetalhesViewController: UIViewController {

@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var nomeLabel: UILabel!
@IBOutlet weak var precoLabel: UILabel!
@IBOutlet weak var descricaoLabel: UILabel!

var oculos: Oculos? {
    didSet {
        nomeLabel.text = oculos?.nome // error on this line
        precoLabel.text = "R$ \(String(describing: oculos?.preco))"
        descricaoLabel.text = oculos?.descricao
    }
}
override func viewDidLoad() {
    super.viewDidLoad()        
}

打印:

typedef std::numeric_limits<float> fl;

int main()
{   
    std::cout.precision(100);    

    float f1 = 9999978e3;
    std::cout << f1 << " (9999978e3 decimal number stored as binary)" << std::endl;

    float f2 = 9999979e3;
    std::cout << f2 << " (9999979e3 decimal number stored as binary)" << std::endl;

    float f3 = 9999990e3;
    std::cout << f3 << " (9999990e3 decimal number stored as binary)" << std::endl;

    std::cout << "-----^" << std::endl;
}

以二进制形式存储的十进制数字正确保留9999978496 (9999978e3 decimal number stored as binary) 9999978496 (9999979e3 decimal number stored as binary) 9999989760 (9999990e3 decimal number stored as binary) -----^ 9999978e3的第6位数( 7 ),但9999979e3的第6位数字是 8 而非 9

浮点精度是否始终保证前6位?

是的,如果我绕 89 9 ,但那不一样;这只会在视觉和#34;中起作用/有意义。

稍后(关于处理数字),当我对该值应用数学时,它会对9999990e3数字(99999 8 9760)起作用,并且不在xxxxx8上。这个数字的+1。

2 个答案:

答案 0 :(得分:8)

不是你认为保证的方式,不是。

通过提供一个反例,对于IEEE754单精度浮点数,最接近的数字

9999990000

9999989760

保证的是,您的号码和float,当两者都四舍五入到六位有效数字时,将是相同的。这是您平台上FLT_DIG的值,假设它实现了IEEE754。例如。与float最接近的9999979000号码为9999978496

请参阅http://www.exploringbinary.com/floating-point-converter/

答案 1 :(得分:1)

你永远不会得到一个精确的数字位数10,因为这个数字不是以10为基数存储的,大多数基数10的分数在基数2中没有完美的表示。几乎总会出现舍入错误,并且通过重复添加你可以放大那个舍入误差。

例如,1/5具有这种二进制模式:

111110010011001100110011001101

我们只关心你所谈论的最后23位(尾数)......

10011001100110011001101

注意1001的重复模式。要真正代表0.2,该模式必须永远重复,而不是以1的舍入结束。

将该数字乘以足够的数量,并将舍入误差放大。

如果您需要精确的十进制数字,则使用整数数学并在分割的情况下以您满意的方式自行处理舍入。或者使用bigint库和有理数,并最终获得需要永远计算的巨大分数,但是你将拥有无限的精度。当然,任何无法表示为sqrt(6)pi的理性数字的数字仍会有舍入错误。