Thanks a lot for the helpful answers!! Andreas
Am 21.06.2016 um 22:19 schrieb Matt D.: > Hi, > > On 6/21/2016 16:33, Andreas Prescher wrote: >> void f(double d) { >> int i = vector.size() * d; >> } > A quick note to add to the other answers: You don't want to be using > `int` here. > Especially since you mention a 64-bit platform -- but IMHO it's a bad > idea in general. > If you'd like a simple rule of thumb, here goes: Avoid using `int` for > anything by default -- especially anything involving > sizes/indexes/counting. Yes, there are exceptional lucky cases when you > may be able to get away with an `int`, but taking these into account is > brittle and anything but "simple." > > Your `vector.size()`, assuming you're dealing with `vector` of type > `std::vector<int>` (as in your later example), has type > `std::vector<int>::size_type` -- which (on your 64-bit platform) will be > 64-bits. > See: http://en.cppreference.com/w/cpp/container/vector/size > In contrast, type `int` is at most 32-bits: > http://en.cppreference.com/w/cpp/language/types > > If the value of the expression involving the vector size value is larger > than what you can store in an `int`, then the size_type->double->int > conversion you're doing when storing to `i` will cause undefined > behavior due to overflow: > http://blog.frama-c.com/index.php?post/2013/10/09/Overflow-float-integer > > While you may (or may not) be in a particularly lucky special case when > the size value just happens to fit in the 32-bits on one occasion, you > may not be on another. > Instead of spending time on deciding "is `int` luckily going to work > today" (or performing an interval analysis involving making guesses > about potential input sample sizes / the ranges of `vector.size()` and > `d`) it's simpler to just use the proper type at all times. > > Now, regarding the rounding and the "adding 0.5" trick, there are some > subtleties here worth being aware of: > http://blog.frama-c.com/index.php?post/2013/05/02/nearbyintf1 > > If you can use C++11 the right choice would be to use these: > http://en.cppreference.com/w/cpp/numeric/math/round > > Refs: > https://randomascii.wordpress.com/2012/04/05/floating-point-complexities/ > https://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ > > > Best, > > Matt > > _______________________________________________ > Rcpp-devel mailing list > Rcpp-devel@lists.r-forge.r-project.org > https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel > > . > _______________________________________________ Rcpp-devel mailing list Rcpp-devel@lists.r-forge.r-project.org https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel