Compare commits

..

2 Commits

Author SHA1 Message Date
dante
be5d241b42 fix: felt to IntegerRep overflow should panic 2025-02-11 21:25:15 -05:00
dante
ae076aef09 refactor: rm tolerance parameter (#937) 2025-02-11 12:57:18 -05:00

View File

@@ -19,6 +19,11 @@ pub fn integer_rep_to_felt<F: PrimeField>(x: IntegerRep) -> F {
/// Converts a PrimeField element to an f64.
pub fn felt_to_f64<F: PrimeField + PartialOrd + Field>(x: F) -> f64 {
if x > F::from_u128(IntegerRep::MAX as u128) {
if x == -F::from_u128(IntegerRep::MAX as u128) - F::ONE {
return IntegerRep::MIN as f64;
} else if x < -F::from_u128(IntegerRep::MAX as u128) - F::ONE {
panic!("Felt value out of range for conversion to integer rep");
}
let rep = (-x).to_repr();
let negtmp: &[u8] = rep.as_ref();
let lower_128: u128 = u128::from_le_bytes(negtmp[..16].try_into().unwrap());
@@ -31,11 +36,13 @@ pub fn felt_to_f64<F: PrimeField + PartialOrd + Field>(x: F) -> f64 {
}
}
/// Converts a PrimeField element to an i64.
/// Converts a PrimeField element to an integer rep.
pub fn felt_to_integer_rep<F: PrimeField + PartialOrd + Field>(x: F) -> IntegerRep {
if x > F::from_u128(IntegerRep::MAX as u128) {
if x == -F::from_u128(IntegerRep::MAX as u128) - F::ONE {
return IntegerRep::MIN;
} else if x < -F::from_u128(IntegerRep::MAX as u128) - F::ONE {
panic!("Felt value out of range for conversion to integer rep");
}
let rep = (-x).to_repr();
let negtmp: &[u8] = rep.as_ref();
@@ -70,6 +77,13 @@ mod test {
assert_eq!(res, F::from(131072));
}
#[test]
#[should_panic]
fn felttointegerrep_overflow() {
let fieldx: F = integer_rep_to_felt::<F>(IntegerRep::MIN) - F::ONE;
let _xf: IntegerRep = felt_to_integer_rep::<F>(fieldx);
}
#[test]
fn felttointegerrep() {
for x in -(2_i128.pow(16))..(2_i128.pow(16)) {