Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Firefox/third_party/rust/minimal-lexical/tests/   (Browser von der Mozilla Stiftung Version 136.0.1©)  Datei vom 10.2.2025 mit Größe 20 kB image not shown  

Quelle  slow_tests.rs   Sprache: unbekannt

 
Spracherkennung für: .rs vermutete Sprache: Unknown {[0] [0] [0]} [Methode: Schwerpunktbildung, einfache Gewichte, sechs Dimensionen]

mod stackvec;

use minimal_lexical::bigint::Bigint;
use minimal_lexical::extended_float::ExtendedFloat;
use minimal_lexical::num::Float;
use minimal_lexical::number::Number;
use minimal_lexical::slow;
use stackvec::vec_from_u32;

fn b<F: Float>(float: F) -> (u64, i32) {
    let fp = slow::b(float);
    (fp.mant, fp.exp)
}

fn bh<F: Float>(float: F) -> (u64, i32) {
    let fp = slow::bh(float);
    (fp.mant, fp.exp)
}

#[test]
fn b_test() {
    assert_eq!(b(1e-45_f32), (1, -149));
    assert_eq!(b(5e-324_f64), (1, -1074));
    assert_eq!(b(1e-323_f64), (2, -1074));
    assert_eq!(b(2e-323_f64), (4, -1074));
    assert_eq!(b(3e-323_f64), (6, -1074));
    assert_eq!(b(4e-323_f64), (8, -1074));
    assert_eq!(b(5e-323_f64), (10, -1074));
    assert_eq!(b(6e-323_f64), (12, -1074));
    assert_eq!(b(7e-323_f64), (14, -1074));
    assert_eq!(b(8e-323_f64), (16, -1074));
    assert_eq!(b(9e-323_f64), (18, -1074));
    assert_eq!(b(1_f32), (8388608, -23));
    assert_eq!(b(1_f64), (4503599627370496, -52));
    assert_eq!(b(1e38_f32), (9860761103));
    assert_eq!(b(1e308_f64), (5010420900022432971));
}

#[test]
fn bh_test() {
    assert_eq!(bh(1e-45_f32), (3, -150));
    assert_eq!(bh(5e-324_f64), (3, -1075));
    assert_eq!(bh(1_f32), (16777217, -24));
    assert_eq!(bh(1_f64), (9007199254740993, -53));
    assert_eq!(bh(1e38_f32), (19721523102));
    assert_eq!(bh(1e308_f64), (10020841800044865970));
}

#[test]
fn slow_test() {
    // 5e-324, round-down.
    let integer = b"2";
    let fraction = b"4703282292062327208828439643411068618252990130716238221279284125033775363510437593264991818081799618989828234772285886546332835517796989819938739800539093906315035659515570226392290858392449105184435931802849936536152500319370457678249219365623669863658480757001585769269903706311928279558551332927834338409351978015531246597263579574622766465272827220056374006485499977096599470454020828166226237857393450736339007967761930577506740176324673600968951340535537458516661134223766678604162159680461914467291840300530057530849048765391711386591646239524912623653881879636239373280423891018672348497668235089863388587925628302755995657524455507255189313690836254779186948667994968324049705821028513185451396213837722826145437693412532098591327667236328124999";
    let num = Number {
        mantissa: 2470328229206232720,
        exponent: -342,
        many_digits: true,
    };
    let fp = ExtendedFloat {
        mant: 1 << 63,
        exp: -63,
    };
    let result = slow::slow::<f64, _, _>(num.clone(), fp, integer.iter(), fraction.iter());
    assert_eq!(result.mant, 0);
    assert_eq!(result.exp, 0);

    // 5e-324, round-up.
    let fraction = b"47032822920623272088284396434110686182529901307162382212792841250337753635104375932649918180817996189898282347722858865463328355177969898199387398005390939063150356595155702263922908583924491051844359318028499365361525003193704576782492193656236698636584807570015857692699037063119282795585513329278343384093519780155312465972635795746227664652728272200563740064854999770965994704540208281662262378573934507363390079677619305775067401763246736009689513405355374585166611342237666786041621596804619144672918403005300575308490487653917113865916462395249126236538818796362393732804238910186723484976682350898633885879256283027559956575244555072551893136908362547791869486679949683240497058210285131854513962138377228261454376934125320985913276672363281251";
    let result = slow::slow::<f64, _, _>(num.clone(), fp, integer.iter(), fraction.iter());
    assert_eq!(result.mant, 1);
    assert_eq!(result.exp, 0);

    // 8.98846567431158e+307
    let integer = b"8";
    let fraction = b"9884656743115805365666807213050294962762414131308158973971342756154045415486693752413698006024096935349884403114202125541629105369684531108613657287705365884742938136589844238179474556051429647415148697857438797685859063890851407391008830874765563025951597582513936655578157348020066364210154316532161708032";
    let num = Number {
        mantissa: 8988465674311580536,
        exponent: 289,
        many_digits: true,
    };
    let fp = ExtendedFloat {
        mant: 9223372036854776832,
        exp: 2035,
    };
    let result = slow::slow::<f64, _, _>(num.clone(), fp, integer.iter(), fraction.iter());
    assert_eq!(result.mant, 0);
    assert_eq!(result.exp, 2046);

    // 8.988465674311582e+307
    let fraction = b"98846567431158053656668072130502949627624141313081589739713427561540454154866937524136980060240969353498844031142021255416291053696845311086136572877053658847429381365898442381794745560514296474151486978574387976858590638908514073910088308747655630259515975825139366555781573480200663642101543165321617080321";
    let result = slow::slow::<f64, _, _>(num.clone(), fp, integer.iter(), fraction.iter());
    assert_eq!(result.mant, 1);
    assert_eq!(result.exp, 2046);
}

#[test]
fn positive_digit_comp_test() {
    // 8.98846567431158e+307
    let bigmant = Bigint {
        data: vec_from_u32(&[
            00000000000000000000000000000,
            010242147483648,
        ]),
    };
    let exponent = 307 + 1 - 308;
    let result = slow::positive_digit_comp::<f64>(bigmant, exponent);
    assert_eq!(result.mant, 0);
    assert_eq!(result.exp, 2046);

    // 8.988465674311582e+307
    let bigmant = Bigint {
        data: vec_from_u32(&[
            10000000000000000000000000000,
            010242147483648,
        ]),
    };
    let exponent = 307 + 1 - 308;
    let result = slow::positive_digit_comp::<f64>(bigmant, exponent);
    assert_eq!(result.mant, 1);
    assert_eq!(result.exp, 2046);
}

#[test]
fn negative_digit_comp_test() {
    // 5e-324, below halfway, round-down to 0.0.
    let bigmant = Bigint {
        data: vec_from_u32(&[
            172773843933006955735090955986862053161569236847506874442688855918,
            2821192818874820963222998811913348873165228284516007355411664240266,
            8445414414877697921855966778283248829950703014814100554672513359584,
            345396320577923789434560883263671009895309445169612501656382682979794,
            35792532317138904383271046672348589728539347109621813530592199705026,
            97639083928054885722194288220209406500625925236393798974617586957244,
            140921882134420501713789534764138019038020552224573535299831429482276,
            389342206133558576721875297301358657054017830623897468662313334501,
            4224406351288499129864978311842263325301632385622824422631440906063,
            393145869635113142761884879882946366824426054826110733796591732329252,
            3828972211191560704936654409371844358779373528117826463350501457460927,
            29400164221051,
        ]),
    };
    let fp = ExtendedFloat {
        mant: 1 << 63,
        exp: -63,
    };
    let exponent = -324 + 1 - 755;
    let result = slow::negative_digit_comp::<f64>(bigmant, fp, exponent);
    assert_eq!(result.mant, 0);
    assert_eq!(result.exp, 0);

    // 5e-324, halfway, round-down to 0.0.
    let bigmant = Bigint {
        data: vec_from_u32(&[
            2084786877507136210266638881931102425273178432722541916566208847286,
            3092404665834918602893735989397375809726001074961476296231754010897,
            422633227325870580819424538048873183413190619901732087471982493283,
            3808794987387483973818545869923508364323202172908018996257102420749567,
            816401711305973060515709341093138812023175628136732058591332985201975,
            101458867237995565785777199054052248225364901975739893596556421532,
            976366795187604779131477055954025764546109727188219105007792397021233,
            1340419138275320759530673285242210626776128044043239408747574172726578,
            1035509558106214542114654488262990139501178542775120939315154055890033,
            338836568722454842423609657408352711451610135778622389075196426934091,
            323793934610713624634070999470250952461228006794810978629952226250520,
            2219833481,
        ]),
    };
    let exponent = -324 + 1 - 752;
    let result = slow::negative_digit_comp::<f64>(bigmant, fp, exponent);
    assert_eq!(result.mant, 0);
    assert_eq!(result.exp, 0);

    // 5e-324, above halfway, round-up to 5e-324.
    let bigmant = Bigint {
        data: vec_from_u32(&[
            36679995877763948088940844151037654204171955615511241983712088472861,
            859275578834918607316755611410828753122312711931476296236360239786,
            360861707010077704383460345488731834230571801217320874732645063646,
            3728211506936917241366000745723904866303742162418163879202732659194,
            38690498195325349792824439209132334916138294449319938202624082215981,
            155595213436358274141482231762186777658721304592113989359658564215320,
            1173733358158060872814122848821602939803238278423719251386082495375854,
            519289497176227217760851417463143128742144697337540419083072560125,
            176516099720315196201769586374413159123767440833237594459701904194670,
            38188858079800059471736835717911406800154584403624159154824269340915,
            231462238821236900452055289038250952461913258430002388695363787668722,
            221983348510,
        ]),
    };
    let exponent = -324 + 1 - 753;
    let result = slow::negative_digit_comp::<f64>(bigmant, fp, exponent);
    assert_eq!(result.mant, 1);
    assert_eq!(result.exp, 0);

    // 1e-323, below halfway, round-down to 5e-324.
    let bigmant = Bigint {
        data: vec_from_u32(&[
            8882480239902086721937352202205861595047077105222520623323771600458,
            84635785136747899210790618422740046621661881239507239328697753503,
            25336243316834208012729330394202497602152109044542301664013245111456,
            177195502423377136841778330386242309509569342049837504969163753972086,
            10737759708467040181223205425186775726532141982961145624482599115079,
            2929172517412149842022878973651987227723348260362228069892601760871734,
            4227656463173621592127786697024140571142187070007520159649021288446830,
            11680266184006757282165625891450825118162053492028742733022645036208,
            1267321906386549738725949349332526789975459036976255235949527750894,
            320444149719440082381359672352283910047341917101913220138979902020460,
            28969820421451853853240638822012381090432615908943364403785677415486,
            2301146753155,
        ]),
    };
    let fp = ExtendedFloat {
        mant: 1 << 63,
        exp: -62,
    };
    let exponent = -324 + 1 - 755;
    let result = slow::negative_digit_comp::<f64>(bigmant, fp, exponent);
    assert_eq!(result.mant, 1);
    assert_eq!(result.exp, 0);

    // 1e-323, halfway, round-up to 1e-323.
    let bigmant = Bigint {
        data: vec_from_u32(&[
            1959393335152140863137041991617407929909453635761625749700626541858,
            6872794032504755829127337533313397013505355194442888870967065395,
            40890622283466206949282736141326619550239571859705196262411652512553,
            2836450370303458462412687936821935158378177021994614039098352967281406,
            24492051345892572234178350338265014789738768071027642808365671335,
            304376601828087351421733159717356681008323571246811196807897169264596,
            292910038513331760778531821943487359048329181564814365350412896096404,
            402125741539646554896120509812336913034384132129732326896793928245144,
            31065286763186436263101379182380483912106131595919868272503577735508,
            1575162471244148543222390376331991408958304073358828722582921280802274,
            112388344632140873913623063818752857385254523654832935889862383784264,
            6659500453,
        ]),
    };
    let exponent = -324 + 1 - 752;
    let result = slow::negative_digit_comp::<f64>(bigmant, fp, exponent);
    assert_eq!(result.mant, 2);
    assert_eq!(result.exp, 0);

    // 1e-323, above halfway, round-up to 1e-323.
    let bigmant = Bigint {
        data: vec_from_u32(&[
            241406416723291844262682253245311296261286370116933725951141970451287,
            2577826735250475582191273375032486259386938135791339214121080719359,
            2235916618302331131250381036226619550269171540369012951233640223643,
            25946999272810751744098002235217171459852233028011541964663903010287,
            3017214866159760493941783503313970047484114883347916864934903656713352,
            37288910823175476511517279921308362466209641033833781443831692645962,
            35212000744468588884236854647513852113285338541614804485293191160267,
            15578684929918492351825542523189429386140534746072262125726627745783,
            1000515697179959156510137918273804839120202322499826884033181417616716,
            28667228302940017843915539855273422040134256481229527791514218088154,
            2648899870207610284018708998193233606562397752900128711187932363006167,
            236453315931,
        ]),
    };
    let exponent = -324 + 1 - 753;
    let result = slow::negative_digit_comp::<f64>(bigmant, fp, exponent);
    assert_eq!(result.mant, 2);
    assert_eq!(result.exp, 0);
}

#[test]
fn parse_mantissa_test() {
    let max_digits = f64::MAX_DIGITS;

    // Large number of digits.
    let integer = b"2";
    let fraction = b"4703282292062327208828439643411068618252990130716238221279284125033775363510437593264991818081799618989828234772285886546332835517796989819938739800539093906315035659515570226392290858392449105184435931802849936536152500319370457678249219365623669863658480757001585769269903706311928279558551332927834338409351978015531246597263579574622766465272827220056374006485499977096599470454020828166226237857393450736339007967761930577506740176324673600968951340535537458516661134223766678604162159680461914467291840300530057530849048765391711386591646239524912623653881879636239373280423891018672348497668235089863388587925628302755995657524455507255189313690836254779186948667994968324049705821028513185451396213837722826145437693412532098591327667236328124999";
    let (bigmant, count) = slow::parse_mantissa(integer.iter(), fraction.iter(), max_digits);
    let expected = vec_from_u32(&[
        17277384393300695573509095598686205316156923684750687444268885591828211928,
        1887482096322299881191334887316522828451600735541166424026684454144,
        148776979218559667782832488299507030148141005546725133595843453963205,
        77923789434560883263671009895309445169612501656382682979794357925323,
        17138904383271046672348589728539347109621813530592199705026976390839,
        280548857221942882202094065006259252363937989746175869572441409218821,
        34420501713789534764138019038020552224573535299831429482276389342206,
        1335585767218752973013586570540178306238974686623133345014224406351288499129,
        86497831184226332530163238562282442263144090606339314586963511314276,
        188487988294636682442605482611073379659173232925238289722111915607049,
        3665440937184435877937352811782646335050145746092729400164221051,
    ]);
    assert_eq!(&*bigmant.data, &*expected);
    assert_eq!(count, 755);

    // Truncation.
    let integer = b"7";
    let fraction = b"4109846876186981626485318930233205854758970392148714663837852375101326090531312779794975454245398856969484704316857659638998506553390969459816219401617281718945106978546710679176872575177347315553307795408549809608457500958111373034747658096871009590975442271004757307809711118935784838675653998783503015228055934046593739791790738723868299395818481660169122019456499931289798411362062484498678713572180352209017023903285791732520220528974020802906854021606612375549983402671300035812486479041385743401875520901590172592547146296175134159774938718574737870961645638908718119841271673056017045493004705269590165763776884908267986972573366521765567941072508764337560846003984904972149117463085539556354188641513168478436313080237596295773983001708984375332669816033062329967789262837";
    let (bigmant, count) = slow::parse_mantissa(integer.iter(), fraction.iter(), max_digits);
    let expected = vec_from_u32(&[
        9836415212202462645417068587515917723645298300148039777271267333311695971390,
        4089590927153284907627055866654046282448407619523232304698923059053929,
        7903578974422965420264381083570486781281808866234858397333653138023,
        28579376896027170043689362390283607819178339247520530689391888214698,
        5500234292968801871046779059128536125984614934162792268520238687651987523901,
        743493573389776908922106135702261081349301505765939497116443346092916,
        24336390513641180610504422692094772649742673149422182927635245032514491481,
        232531241517412428142479923579109825012224162115093612906464403420662,
        36632503141993722098365907183427022631239621311854329524952963635838,
        299628922732002893912753231690278028610988437316314185332043382415762,
        49954156233696254013421327641352677015531099831881157439767734593155,
    ]);
    assert_eq!(&*bigmant.data, &*expected);
    assert_eq!(count, max_digits + 1);

    // No fraction digits.
    let integer = b"74109846876186981626485318930233205854758970392148714663837852375101326090531312779794975454245398856969484704316857659638998506553390969459816219401617281718945106978546710679176872575177347315553307795408549809608457500958111373034747658096871009590975442271004757307809711118935784838675653998783503015228055934046593739791790738723868299395818481660169122019456499931289798411362062484498678713572180352209017023903285791732520220528974020802906854021606612375549983402671300035812486479041385743401875520901590172592547146296175134159774938718574737870961645638908718119841271673056017045493004705269590165763776884908267986972573366521765567941072508764337560846003984904972149117463085539556354188641513168478436313080237596295773983001708984375332669816033062329967789262837";
    let fraction = b"";
    let (bigmant, count) = slow::parse_mantissa(integer.iter(), fraction.iter(), max_digits);
    assert_eq!(&*bigmant.data, &*expected);
    assert_eq!(count, max_digits + 1);

    // Multiple of step (check we add our temporary correctly).
    let integer = b"7410984687618698162648531893023320585475897039214871466383785237510132609053131277979497545424539885696948470431685765963899850655339096945981621940161728171894510697854671067917687257517734731555330779540854980960845750095811137303474765809687100959097544227100475730780971111893578483867565399878350301522805593404659373979179073872386829939581848166016912201945649993128979841136206248449867871357218035220901702390328579173252022052897402080290685402160661237554998340267130003581248647904138574340187552090159017259254714629617513415977493871857473787096164563890871811984127167305601704549300470526959016576377688490826798697257336652176556794107250876433756084600398490497214911746308553955635418864151316847843631308023759629577398300170898437533266981";
    let fraction = b"";
    let (bigmant, count) = slow::parse_mantissa(integer.iter(), fraction.iter(), max_digits);
    let expected = vec_from_u32(&[
        61701840539621140121304023833812547827426368377039180124961787721490,
        24930146944354646263720854431292850950726779324363690496503606588290,
        2312371412231172875335815236795217925277781000710161850795966819152331711780,
        5934872724212730845339602972409782979326242753641821150353414687403,
        37115189524168896929483727327165708003127855886281009114769482126749,
        485376744112370533732255019412939050108133845100521042639473425461126,
        183422492840610257047920938152707019125361027120342541015291026215278,
        4117890107174811041625351116068096512038238221152354910057590658512,
        2682089507159300272177656944233821664793222978591540586210934713382,
        2014123057145555579041191314653685912982301994729134378916782660105801,
        260586076239437351541770815321616198650158039908220176174523327697130,
        315505357,
    ]);
    assert_eq!(&*bigmant.data, &*expected);
    assert_eq!(count, 760);
}

[Dauer der Verarbeitung: 0.16 Sekunden, vorverarbeitet 2026-06-06]