@@ -139,14 +139,27 @@ class BivariateNormalDistribution {
139139 Point2 TransformPoint (Point2 const &in_point) const {
140140 if (is_circular_) {
141141 return Point2 ((in_point - mean_) / sigma_.x ());
142- } else {
143- Point2 translated = in_point - mean_;
144- Point2 normalized (translated.x () / sigma_.x (),
145- translated.y () / sigma_.y ());
146- return Point2 ((normalized.x () - rho_ * normalized.y ()) /
147- (std::sqrt (1 - rho_ * rho_)),
148- normalized.y ());
149142 }
143+ Point2 translated = in_point - mean_;
144+ Point2 normalized (translated.x () / sigma_.x (), translated.y () / sigma_.y ());
145+ return Point2 (
146+ (normalized.x () - rho_ * normalized.y ()) / (std::sqrt (1 - rho_ * rho_)),
147+ normalized.y ());
148+ }
149+
150+ Point2f TransformPoint (Point2f const &in_point_f) const {
151+ Point2f mean_f = mean_.cast <float >();
152+ Point2f sigma_f = sigma_.cast <float >();
153+ float rho_f = static_cast <float >(rho_);
154+ if (is_circular_ or std::abs (rho_f) < kEpsf ) {
155+ return Point2f ((in_point_f - mean_f) / sigma_f.x ());
156+ }
157+ Point2f translated = in_point_f - mean_f;
158+ Point2f normalized (translated.x () / sigma_f.x (),
159+ translated.y () / sigma_f.y ());
160+ return Point2f (
161+ (normalized.x () - rho_f * normalized.y ()) / (sqrt (1 - rho_f * rho_f)),
162+ normalized.y ());
150163 }
151164
152165 /* !
@@ -158,18 +171,16 @@ class BivariateNormalDistribution {
158171 * @return Value of the integral
159172 */
160173 double IntegrateQuarterPlane (Point2 const &point) const {
161- auto transformed_point = TransformPoint (point);
174+ Point2 transformed_point = TransformPoint (point);
162175 return scale_ * std::erfc (transformed_point.x () * kOneBySqrt2 ) *
163176 std::erfc (transformed_point.y () * kOneBySqrt2 ) / 4 .;
164177 }
165178
166- float IntegrateQuarterPlaneF (Point2 const &point) const {
167- auto transformed_point = TransformPoint (point);
168- float x = static_cast <float >(transformed_point.x ());
169- float y = static_cast <float >(transformed_point.y ());
170- float scale = static_cast <float >(scale_);
171- return scale * std::erfc (x * kOneBySqrt2f ) * std::erfc (y * kOneBySqrt2f ) /
172- 4 .f ;
179+ float IntegrateQuarterPlane (Point2f const &point) const {
180+ float scale_f = static_cast <float >(scale_);
181+ Point2f transformed_point = TransformPoint (point);
182+ return scale_f * std::erfc (transformed_point.x () * kOneBySqrt2f ) *
183+ std::erfc (transformed_point.y () * kOneBySqrt2f ) / 4 .f ;
173184 }
174185};
175186
0 commit comments