1717package noise
1818
1919import (
20+ "fmt"
2021 "math"
2122
2223 "github.com/google/differential-privacy/go/v4/checks"
@@ -61,7 +62,11 @@ func (laplace) AddNoiseFloat64(x float64, l0Sensitivity int64, lInfSensitivity,
6162 if err := checkArgsLaplace (l0Sensitivity , lInfSensitivity , epsilon , delta ); err != nil {
6263 return 0 , err
6364 }
64- return addLaplaceFloat64 (x , epsilon , lInfSensitivity * float64 (l0Sensitivity ) /* l1Sensitivity */ ), nil
65+ l1Sensitivity := lInfSensitivity * float64 (l0Sensitivity )
66+ if math .IsInf (l1Sensitivity , 0 ) || math .IsNaN (l1Sensitivity ) {
67+ return 0 , fmt .Errorf ("l1Sensitivity overflows: lInfSensitivity=%v * l0Sensitivity=%v produces %v" , lInfSensitivity , l0Sensitivity , l1Sensitivity )
68+ }
69+ return addLaplaceFloat64 (x , epsilon , l1Sensitivity ), nil
6570}
6671
6772// AddNoiseInt64 adds Laplace noise to the specified int64 x so that the
@@ -71,7 +76,11 @@ func (laplace) AddNoiseInt64(x, l0Sensitivity, lInfSensitivity int64, epsilon, d
7176 if err := checkArgsLaplace (l0Sensitivity , float64 (lInfSensitivity ), epsilon , delta ); err != nil {
7277 return 0 , err
7378 }
74- return addLaplaceInt64 (x , epsilon , lInfSensitivity * l0Sensitivity /* l1Sensitivity */ ), nil
79+ l1Sensitivity := lInfSensitivity * l0Sensitivity
80+ if (l0Sensitivity != 0 && l1Sensitivity / l0Sensitivity != lInfSensitivity ) || l1Sensitivity < 0 {
81+ return 0 , fmt .Errorf ("l1Sensitivity overflows: lInfSensitivity=%v * l0Sensitivity=%v wraps to %v" , lInfSensitivity , l0Sensitivity , l1Sensitivity )
82+ }
83+ return addLaplaceInt64 (x , epsilon , l1Sensitivity ), nil
7584}
7685
7786// Threshold returns the smallest threshold k to use in a differentially private
0 commit comments