是否存在整数在转换为double时失去其精度的情况?

时间:2016-04-20 05:06:36

标签: c casting

假设我有

j

24.9999999..upto_allowed是否有可能拥有值25.00000000..._upto_allowed_minus_one_and_then_1// // ViewController.swift // Project import UIKit class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { @IBOutlet var tableView: UITableView! var videos:[Video] = [Video]() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let model = VideoModel() self.videos = model.getVideos() self.tableView.dataSource = self self.tableView.delegate = self } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return videos.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("BasicCell")! //let videoTitle = videos[indexPath.row].videoTitle //Customize the cell to display the video title //cell.textLabel?.text = videoTitle //Construct the video thumbnail url //LINE A //let videoThumbnailUrlString = "https://i.imgur.com/bYESnOo.jpg" //LINE B let thumbnailId = videos[indexPath.row].thumbnailId let videoThumbnailUrlString = "/Users/User/Documents/Project/" + thumbnailId + ".JPG" //Create a NSURL object if let videoThumbnailUrl = NSURL(string: videoThumbnailUrlString) { //Create a NSURLRequest object let request = NSURLRequest(URL: videoThumbnailUrl) //Create a NSURLSession let session = NSURLSession.sharedSession() //Create a datatask and pass in the request let dataTask = session.dataTaskWithRequest(request, completionHandler: { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in dispatch_async(dispatch_get_main_queue(), { () -> Void in //Get a reference to the imageview element of the cell if let imageView = cell.viewWithTag(1) as? UIImageView { if let data = data { //Create an image object from the data and assign it into the imageView imageView.image = UIImage(data: data) } } }) }) dataTask.resume() } else { print("\(videoThumbnailUrlString) is an invalid path") } return cell } 。我记得在某处读过这些东西但却无法正常回忆。

换句话说:

是否存在整数在转换为double时失去其精度的情况?

3 个答案:

答案 0 :(得分:5)

对于像25这样的小数字,你很好。对于int为64位(具有无法在53位中表示的值)或更多的架构上的int s的非常大(绝对)值,您将失去精度。

Double precision floating point number具有53位精度,其中最重要的位(隐式)通常为1

在浮点表示不是IEEE-754的平台上,答案可能略有不同。有关详细信息,请参阅C99 / C11规范的第5.2.4.2.2

答案 1 :(得分:2)

IEEE-754 double的有效位精度为53位。这意味着它可以存储2 ^ 53和-2 ^ 53范围内的所有有符号整数。

IEEE 754 Floating Point

由于int通常在大多数编译器/体系结构上具有32位,因此double通常能够处理int

答案 2 :(得分:0)

@Mohit Jain答案对于实用编码很有用。

根据C规范,DBL_DIGFLT_RADIX/DBL_MANT_DIGINT_MAX/INT_MIN是重要的值。

DBL_DIG在最大十进制数字中,一个数字可以具有转换为double并且返回肯定具有相同值的数字。 至少 10.因此像9,999,999,999这样的整数肯定可以转换为double而不会丢失精度。可能更大的值也可以成功地往返。

真正的往返问题以超过+/-power(FLT_RADIX, DBL_MANT_DIG)的整数值开始。 FLT_RADIX是浮点数基础(绝大多数是2),而DBL_MANT_DIG是浮点数有效数字中的"数量的基数 - FLT_RADIX数字&#34 ;例如53与IEEE-754 binary64。

当然,int的范围为[INT_MIN ... INT_MAX]。范围必须至少 [-32767 ... + 32,767]。

在数学上power(FLT_RADIX, DBL_MANT_DIG) >= INT_MAX时,没有转换问题。这适用于所有符合C的编译器。