as
ã®saturating-float-castsåäœãå®å®ããã以åã®åäœãåŠçããå®å
šã§ãªãã©ã€ãã©ãªé¢æ°ãå®å®ãããäºå®ã§ãã ãã®å®å®åããã»ã¹ã«é¢ããææ°ã®è°è«ã«ã€ããŠã¯ãïŒ71269ãåç
§ããŠãã ããã
ã³ã³ãã€ã©ã«ãã©ã°-Zsaturating-float-casts
ãå®è£
ãããŸãããããã«ããããã¹ãŠã®æµ®åå°æ°ç¹ããæŽæ°ãžã®ãã£ã¹ããã飜åãåäœã«ãªããç¯å²å€ã®å Žåã¯æãè¿ãç¯å²ã«ã¯ã©ã³ããããŸãã ãã®å€æŽã®ãã³ãããŒã¯ã®ãäžéšã®ãããžã§ã¯ãã§ã¯
次ã®ã¹ãããã¯ããããã®ã±ãŒã¹ã®ããã©ãŒãã³ã¹ãå埩ããæ¹æ³ãç解ããããšã§ãã
as
ãã£ã¹ãåäœïŒå Žåã«ãã£ãŠã¯UBïŒã䜿çšããŠãé¢é£ããã¿ã€ããªã©ã«unsafe
é¢æ°ãè¿œå ããããšã§ããfreeze
æŠå¿µãè¿œå ããã®ãåŸ
ã€ããšã§ããããã¯ãã¬ããŒãžããããã¿ãŒã³ãååŸããããšãæå³ããŸãããå°ãªããšãUBã§ã¯ãããŸãããæŽæ°ïŒ@nikomatsakisã«ããïŒïŒå€ãã®è°è«ã®åŸããã®åé¡ã«å¯ŸåŠããæ¹æ³ã®èšç»ã®åºæ¬ããããŸãã ãã ããããã©ãŒãã³ã¹ãžã®åœ±é¿ãå®éã«èª¿æ»ããæçµçãªè©³çŽ°ãææ¡ããã«ã¯ãããçšåºŠã®æ¯æŽãå¿ èŠã§ãã
å ã®åé¡ã¯æ¬¡ã®ãšããã§ãã
å€ãty2ã«åãŸããªãå Žåãçµæã¯æªå®çŸ©ã§ãã
1.04E+17 as u8
æå
P-highã§åãå ¥ããããïŒ10183ãšåãçç±
ããã¯èšèªã¬ãã«ã§åŸæ¹äºææ§ããªããšæããŸãã æ£åžžã«æ©èœããŠããã³ãŒããæ©èœãåæ¢ããããšã¯ãããŸããã æåã
P-highã«å€æŽãïŒ10183ãšåãçç±
ãããšïŒ10185ãã©ã®ããã«è§£æ±ºããããšãææ¡ããŸããïŒ åäœãå®çŸ©ãããŠãããã©ããã¯ããã£ã¹ããããæ°å€ã®åçãªå€ã«äŸåãããããå¯äžã®è§£æ±ºçã¯åçãã§ãã¯ãæ¿å ¥ããããšã§ããããã«æãããŸãã ç®è¡ãªãŒããŒãããŒã§ã¯ãããå®è¡ããããªãããšã«åæããŠããããã§ããããã£ã¹ããªãŒããŒãããŒã§ã¯å®è¡ã§ããŸããïŒ
ãå®å šãªå€æããå®è¡ããçµã¿èŸŒã¿é¢æ°ãLLVMã«è¿œå ã§ããŸãã @zwarichã¯ä»ã®ã¢ã€ãã¢ãæã£ãŠãããããããŸããã
çŸæç¹ã§ã®å¯äžã®è§£æ±ºçã¯ãã¿ãŒã²ããåºæã®çµã¿èŸŒã¿é¢æ°ã䜿çšããããšã§ãã å°ãªããšãç§ãå°ãã誰ãã«ãããšãããã¯JavaScriptCoreãè¡ãããšã§ãã
ããããããªãç°¡åã§ãã
ping @pnkfelixããã¯æ°ãããªãŒããŒãããŒãã§ãã¯ã®ãã®ã§ã«ããŒãããŠããŸããïŒ
ãããã®ãã£ã¹ãã¯ããããã°ã¢ãµãŒã·ã§ã³ã䜿çšããrustcã«ãã£ãŠãã§ãã¯ãããŸããã
ç§ã¯ãããåãã§åŠçããŸãããå ·äœçãªè§£æ±ºçãå¿ èŠã§ãã å人çã«ã¯ãéåžžã«ãã䌌ãåé¡ãªã®ã§ããªãŒããŒãããŒããæŽæ°æŒç®ãšäžç·ã«ãã§ãã¯ããå¿ èŠããããšæããŸãã ç§ã¯ç§ãã¡ãäœããããã¯æ¬åœã«æ°ã«ããŸããã
ãã®åé¡ã¯ãç¹å®ã®å®æ°åŒã§äœ¿çšãããå ŽåãçŸåšICEãåŒãèµ·ãããŠããããšã«æ³šæããŠãã ããã
ããã«ãããå®å šãªéã§ã¡ã¢ãªã®å®å šæ§ã䟵害ããããšãã§ããŸãããã®ãã©ãŒã©ã ã®æçš¿ã®äŸïŒ
Undefsããã¡ãïŒ Undefã¯æ¥œããã§ãã ãããã¯äŒæããåŸåããããŸãã æ°åã®ã©ã³ã°ãªã³ã°ã®åŸ..
#[inline(never)]
pub fn f(ary: &[u8; 5]) -> &[u8] {
let idx = 1e100f64 as usize;
&ary[idx..]
}
fn main() {
println!("{}", f(&[1; 5])[0xdeadbeef]);
}
-Oã䜿çšããã·ã¹ãã ã®ã»ã°ã¡ã³ããŒã·ã§ã³éåïŒæ¯æ©é ãïŒã
å®å šãªéã§ã®ã¡ã¢ãªå®å šæ§ã®éåãèæ ®ããŠãI-unsoundã§ããŒã¯ããŸãã
@bluss ãããã¯ç§ã«ãšã£ãŠsegfualtã§ã¯ãªããã¢ãµãŒã·ã§ã³ãšã©ãŒãäžããã ãã§ãã ç§ããããè¿œå ããã®ã§ã¿ã°ãå€ããŸã
ããæ¯ã-Oãå¿ããŠãã¿ã°ãä»ãçŽããŸããã
P-highã«åæåã ã©ãããããã¯ããæç¹ã§P-highã§ããããæéã®çµéãšãšãã«äœããªããŸããã ããã¯æ£ç¢ºãã®ããã«ããªãéèŠãªããã§ãã
ç·šéïŒããªã¢ãŒãžã³ã¡ã³ãã«åå¿ãããæåã§ã©ãã«ãè¿œå ããŸããã
ãªãŒããŒãããŒã®åäŸïŒã·ãããªã©ïŒã¯ãäœããã®åäœã«èœã¡çãããšã§ããããã«æãããŸãã Javaã¯ç¯å²ãæ³ãšããŠçµæãçæããããã§ãããããã¯äžåçã§ã¯ãªãããã§ãã ãããåŠçããããã«å¿ èŠãªLLVMã³ãŒãã®çš®é¡ãããããŸããã
https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls -5.1.3ã«ãããšãJavaã¯NaN
å€ã0ãšç¡é倧ã«ããããããããšãä¿èšŒããŸãæå°/æ倧ã®è¡šçŸå¯èœãªæŽæ°ã«ã ããã«ãå€æã®Javaã«ãŒã«ã¯ãåãªãã©ããã³ã°ãããè€éã§ããã飜åïŒ int
ãŸãã¯long
ãžã®å€æã®å ŽåïŒãšã©ããã³ã°ïŒããå°ããªæŽæ°åãžã®å€æã®å ŽåïŒã®çµã¿åããã«ããããšãã§ããŸãã ã å¿
èŠã«å¿ããŠïŒã Javaããå€æã¢ã«ãŽãªãºã å
šäœãè€è£œããããšã¯ç¢ºãã«å¯èœã§ããããã£ã¹ãããšã«ããªãã®éã®æäœãå¿
èŠã«ãªããŸãã ç¹ã«ãLLVMã§ã®fpto[us]i
æäœã®çµæãæªå®çŸ©ã®åäœã瀺ããªãããã«ããã«ã¯ãç¯å²ãã§ãã¯ãå¿
èŠã«ãªããŸãã
å¥ã®æ¹æ³ãšããŠãfloat-> intãã£ã¹ãã¯ãå
ã®å€ã®åãæšãŠãå®å
ã¿ã€ãã®å€ïŒãŸãã¯[iu]size
ïŒïŒãšããŠè¡šãããå Žåã«ã®ã¿æå¹ã§ããããšãä¿èšŒãããããšããå§ãããŸããå€ãå¿ å®ã«è¡šçŸãããŠããªãå Žåã«ãããã¯ãåŒãèµ·ãããããã°ãã«ãã«é¢ããã¢ãµãŒã·ã§ã³ããããŸãã
Javaã¢ãããŒãã®äž»ãªå©ç¹ã¯ãå€æé¢æ°ãå®å šã§ããããšã§ãããããã¯äºæããªãåäœãå¿ã³å¯ãå¯èœæ§ãããããšãæå³ããŸããæªå®çŸ©ã®åäœã¯é²æ¢ãããŸããããã£ã¹ããå®éã«æå³ããããã©ããããã§ãã¯ããªãããã«ã ãŸããããããªããŸãã ïŒããã¯æ®å¿µãªããä»ã®ãã£ã¹ãã«ãåœãŠã¯ãŸããŸãïŒå¿é :)ã
ãã1ã€ã®ã¢ãããŒãã¯ãçŸåšç®è¡æŒç®ã«äœ¿çšãããŠããã¢ãããŒããšäžèŽããŸãããªãªãŒã¹ã§ã®ã·ã³ãã«ã§å¹ççãªå®è£
ããããã°ã§ã®ç¯å²ãã§ãã¯ã«ãã£ãŠããªã¬ãŒããããããã¯ã§ãã æ®å¿µãªãããä»ã®as
ãã£ã¹ããšã¯ç°ãªããããã«ãããã®ãããªå€æããã§ãã¯ãããŸããããã¯ãŠãŒã¶ãŒã«ãšã£ãŠé©ãã¹ãããšã§ãïŒãã ããç®è¡æŒç®ãšã®é¡äŒŒæ§ãããã§åœ¹ç«ã€å ŽåããããŸãïŒã ãããäžéšã®ã³ãŒããå£ããŸãããAFAICTã¯ãçŸåšæªå®çŸ©ã®åäœã«äŸåããŠããã³ãŒãã§ã®ã¿çºçããã¯ãã§ãïŒã€ãŸããæªå®çŸ©ã®åäœããä»»æã®æŽæ°ãè¿ããŸããããæããã«ã©ã¡ãã§ãããŸããŸãããããããã¯ã«çœ®ãæããŸãïŒã
åé¡ã¯ãæŽæ°ãè¿ãããã©ã¡ãã§ãããŸããªããã§ã¯ãªããã©ã³ãã ãªå€ã§ã¯ãªã錻ã®æªéã®å€ã§ããundefãåŒãèµ·ãããLLVMã¯undefãçºçããªããšæ³å®ã§ããããšã§ããã²ã©ãééã£ãããšãããæé©åãå¯èœã«ããŸãã ãããã©ã³ãã ãªå€ã§ãããã決å®çã«undefã§ã¯ãªãå Žåãããã¯å¥å šæ§ã®åé¡ãä¿®æ£ããã®ã«ååã§ãã è¡šçŸã§ããªãå€ãã©ã®ããã«è¡šçŸãããããå®çŸ©ããå¿ èŠã¯ãããŸãããundefãé²ãå¿ èŠããããŸãã
@ rust-lang / compilerããŒãã£ã³ã°ã§è°è«ãããŸããã æãäžè²«ããè¡åæ¹éã¯æ®ã£ãŠããŸãïŒ
äž»ãªåé¡ã¯ããªãã·ã§ã³2ã®å ·äœçãªææ¡ãå¿ èŠãªããšã§ãã
ããªã¢ãŒãžïŒP-medium
@nikomatsakis as
çŸåšããããã°ãã«ãã§ãããã¯ã«ãªã£ãããšã¯ãããŸããïŒ ããã§ãªãå Žåã¯ãäžè²«æ§ãšäºæž¬å¯èœæ§ã®ããã«ããã®ãŸãŸã«ããŠããããšãæãŸããããã§ãã ïŒç®è¡ãšåãããã«ãããã¹ãã ãšæããŸãããããã¯å¥ã®éå»ã®è°è«ã§ããïŒ
ãã以å€ã®å Žåã¯ããã©ãŒã«ããã¯åäœãå¿ èŠã§ããæå¹ãªå€ã®å®è¡æã³ã¹ããæå°ïŒçæ³çã«ã¯ãŒãïŒã§ããå¿ èŠããããŸãããLLVM undefã§ãªãéããæ£ç¢ºãªåäœã¯ããã»ã©éèŠã§ã¯ãããŸããã
å
·äœçãªææ¡ïŒæ°åãšææ°ãu64
ãšããŠæœåºããæ°åãææ°ã§ãããã·ããããŸãã
fn f64_as_u64(f: f64) -> u64 {
let (mantissa, exponent, _sign) = f.integer_decode();
mantissa >> ((-exponent) & 63)
}
ã¯ããããã¯ãŒãã³ã¹ãã§ã¯ãããŸããããããçšåºŠæé©åå¯èœã§ããïŒ integer_decode inline
ãšããŒã¯ããæ¹ãããã§ãããïŒãå°ãªããšã決å®è«çã§ãã float-> intãã£ã¹ããæ¡åŒµããå°æ¥ã®MIRãã¹ã¯ãfloatããã£ã¹ãããŠãåé¡ãªãããšãä¿èšŒãããŠãããã©ãããåæãããã®éãå€æãã¹ãããããå¯èœæ§ããããŸãã
LLVMã«ã¯å€æé¢æ°çšã®ãã©ãããã©ãŒã çµã¿èŸŒã¿é¢æ°ããããŸãããïŒ
ç·šéïŒ @zwarichã¯èšã£ãïŒãã£ãšåã«ïŒïŒ
çŸæç¹ã§ã®å¯äžã®è§£æ±ºçã¯ãã¿ãŒã²ããåºæã®çµã¿èŸŒã¿é¢æ°ã䜿çšããããšã§ãã å°ãªããšãç§ãå°ãã誰ãã«ãããšãããã¯JavaScriptCoreãè¡ãããšã§ãã
ãªããããã¯ã«ããæ©ãã®ã§ããïŒ AFAIKã @ glaebhoerlã¯æ£ããã as
ã¯åãæšãŠ/æ¡åŒµããããšã«ãªã£ãŠããããªãã©ã³ãããã§ãã¯ããªãã
2016幎3æ5æ¥åææ¥03:47:55 AM -0800ã«ãGáborLehelã¯æ¬¡ã®ããã«æžããŠããŸãã
@nikomatsakis
as
çŸåšããããã°ãã«ãã§ãããã¯ã«ãªã£ãããšã¯ãããŸããïŒ ããã§ãªãå Žåã¯ãäžè²«æ§ãšäºæž¬å¯èœæ§ã®ããã«ããã®ãŸãŸã«ããŠããããšãæãŸããããã§ãã ïŒç®è¡ãšåãããã«ãããã¹ãã ãšæããŸãããããã¯å¥ã®éå»ã®è°è«ã§ããïŒ
æ¬åœã ç§ã¯ããã説åŸåããããšæããŸãã
2016幎3æ9æ¥æ°Žææ¥02:31:05 AM -0800ãEduard-MihaiBurtescuã¯æ¬¡ã®ããã«æžããŠããŸãã
LLVMã«ã¯å€æé¢æ°çšã®ãã©ãããã©ãŒã çµã¿èŸŒã¿é¢æ°ããããŸãããïŒ
ç·šéïŒ
çŸæç¹ã§ã®å¯äžã®è§£æ±ºçã¯ãã¿ãŒã²ããåºæã®çµã¿èŸŒã¿é¢æ°ã䜿çšããããšã§ãã å°ãªããšãç§ãå°ãã誰ãã«ãããšãããã¯JavaScriptCoreãè¡ãããšã§ãã
ãªããããã¯ã«ããæ©ãã®ã§ããïŒ AFAIKã @ glaebhoerlã¯æ£ããã
as
ã¯åãæšãŠ/æ¡åŒµããããšã«ãªã£ãŠããããªãã©ã³ãããã§ãã¯ããªãã
ã¯ããç§ã¯ä»¥åã«ééã£ãŠãããšæããŸãã as
ã¯ããã§ãã¯ãããŠããªãåãæšãŠãã§ã
ãªãã¬ãŒã¿ãŒãè¯ããæªãããäžè²«æ§ãä¿ã€ã®ãæåã®ããã§ã
ãã®å²åŠã§ã ã¿ãŒã²ããåºæã®çµã¿èŸŒã¿é¢æ°ã䜿çšããããšã¯å®å
šã«å¯èœæ§ããããŸã
ã§ãè¯ã解決çïŒ
@nikomatsakis ïŒåäœã¯ãŸã å®çŸ©ãããŠããªãããã§ããïŒ ããã«é¢ããèšç»ã«ã€ããŠã®ææ°æ å ±ãæããŠããã ããŸããïŒ
ã¯ããã«å°ãªãæ°ã§ããã«ééããã ãã§ã
let x: f64 = -1.0;
x as u8
æé©åã«å¿ããŠ0ã16ãªã©ã®çµæã«ãªããŸããã255ãšããŠå®çŸ©ãããããšãæåŸ
ããŠããã®ã§ã x as i16 as u8
ãèšè¿°ããå¿
èŠã¯ãããŸããã
@gmorenz !0u8
ãè©ŠããŸãããïŒ
æå³ããªããªãã³ã³ããã¹ãã§ã¯ã[-255ã255]ã®ç¯å²ã§ããããã¯ãŒã¯ãä»ããŠéä¿¡ãããããŒã¿ã®å€æããf64ãååŸããŠããŸããã ç§ã¯ãããããŸãã©ããããããšãæãã§ããŸããïŒ <i32> as u8
ãã©ããããã®ãšãŸã£ããåãæ¹æ³ã§ïŒã
ããããkillundefã http://lists.llvm.org/pipermail/llvm-dev/2016-October/106182.htmlã«å¯Ÿããæè¿ã®LLVMã®ææ¡ã§ããããããèªåçã«è§£æ±ºããããã©ãããç¥ãã®ã«ååãªç¥èã¯ã»ãšãã©ãããŸããããã®åé¡ã
圌ãã¯undefãpoisonã«çœ®ãæããŠãããã»ãã³ãã£ã¯ã¹ã¯ãããã«ç°ãªããŸãã int-> floatãå®çŸ©ãããåäœããã£ã¹ãããããšã¯ãããŸããã
飜åãã£ã¹ããè¡ãããã®æ瀺çãªæ¹æ³ãæäŸããå¿ èŠããããŸã
https://github.com/rust-lang/rust/issues/10184#issuecomment -139858153ãèãããšããã®ããã«I-crashãšããŒã¯ããå¿ èŠãããããã§ãã
ä»æ¥#rust-beginners
ããã«ã€ããŠè³ªåããããŸãããã誰ããéçã§ããã«ééããŸããã
ç§ã@jimblandyã§æžããŠããæ¬ã_Programming Rust_ã¯ããã®ãã°ã«ã€ããŠèšåããŠããŸãã
æ°çš®é¡ã®ãã£ã¹ããèš±å¯ãããŠããŸãã
æ°å€ã¯ãçµã¿èŸŒã¿ã®æ°å€ã¿ã€ãããä»ã®ã¿ã€ãã«ãã£ã¹ãã§ããŸãã
ïŒ...ïŒ
ãã ãããã®èšäºã®å·çæç¹ã§ã¯ã倧ããªæµ®åå°æ°ç¹å€ãå°ããããŠè¡šçŸã§ããªãæŽæ°åã«ãã£ã¹ããããšãæªå®çŸ©ã®åäœãçºçããå¯èœæ§ããããŸãã ããã«ãããå®å šãªRustã§ãã¯ã©ãã·ã¥ãçºçããå¯èœæ§ããããŸãã ããã¯ãã³ã³ãã€ã©github.com/rust-lang/rust/issues/10184ã®ãã°
ãã®ç« ã®ç· ãåãã¯5æ19æ¥ã§ããæåŸã®æ®µèœãåé€ãããã®ã§ãããå°ãªããšãæåã«äœããã®èšç»ãç«ãŠãå¿ èŠããããšæããŸãã
ã©ãããçŸåšã®JavaScriptCoreã¯x86ã§äœ¿çšããŠããŸãã 圌ãã¯CVTTSD2SIåœä»€ã䜿çšããå€ãç¯å²å€ã®å Žåã¯ããã€ãã®ãã¢ãªãŒC ++ã«ãã©ãŒã«ããã¯ããŸãã çŸåšãç¯å²å€ã®å€ãççºããŠããããããã®åœä»€ã䜿çšãããšïŒãã©ãŒã«ããã¯ãªãã§ïŒïŒã1ã€ã®ã¢ãŒããã¯ãã£ã®ã¿ã§ã¯ãããŸãããçŸåšã®ç¶æ ãæ¹åãããŸãã
æ£çŽãªãšããã as
æ°å€ãã£ã¹ããå»æ¢ãã代ããã«From
ãšTryFrom
ãŸãã¯convcrateã®ãããªãã®ã䜿çšããå¿
èŠããããšæããŸãã
ãã¶ããããããããŸããããããã¯ç§ã«ã¯çŽäº€ããŠããããã§ãã
OKããã®äŒè©±å
šäœãèªã¿çŽããŸããã ãã®æäœã¯ãããã¯ã«ãªããªããšããåæããããšæããŸãïŒ as
ãšã®äžè¬çãªäžè²«æ§ã®ããïŒã è¡åãã©ãããã¹ããã«ã€ããŠã¯ã2ã€ã®äž»èŠãªåè£ããããŸãã
æåã®ã±ãŒã¹ã§çµæãã©ãããã¹ããã«ã€ããŠæ確ãªåäŸããããã©ããã¯ç§ã«ã¯ããããŸãããïŒ
ãããæžãçããåŸãç§ã®å¥œã¿ã¯æ±ºå®è«çãªçµæãç¶æããããšã§ãã 決å®è«ã®ç·ãåŒãããšãã§ãããã¹ãŠã®å Žæãåå©ã§ããããã«ç§ã¯æããŸãã ããããçµæãã©ãããã¹ã
飜åã¯ç解ã§ããŠäŸ¿å©ãªããã«èŠããã®ã§å¥œãã§ããã u64 as u32
ãåãæšãŠãè¡ãæ¹æ³ãšã¯ã©ããããããäžèŽããŠããªãããã§ãã ãããã£ãŠãããããåãæšãŠã«åºã¥ãããçš®ã®çµæã¯çã«ããªã£ãŠããŸããããã¯ãããã@ oli-obkãææ¡ãããã®ã ãšæããŸãããã®ã³ãŒããäœãæå³ããŠããã®ãå®å
šã«ã¯ç解ããŠããŸããã =ïŒ
ç§ã®ã³ãŒãã¯ã0..2 ^ 64ã®ç¯å²ã®å€ã«æ£ããå€ãäžãããã以å€ã®ãã¹ãŠã«ã¯æ±ºå®è«çã§ããåœã®å€ãäžããŸãã
æµ®åå°æ°ç¹æ°ã¯ä»®æ°^ææ°ã§è¡šãããŸããããšãã°ã 1.0
ã¯(2 << 52) ^ -52
ããããããã·ãããšææ°ã¯ãã€ããªã§åããã®ã§ãããããã·ãããéã«ããããšãã§ããŸãïŒãããã£ãŠãææ°ãšå³ã®åŠå®ïŒã·ããïŒã
決å®è«ã®å Žåã¯+1ã
人éã«ãšã£ãŠæå³ã®ãã2ã€ã®ã»ãã³ãã£ã¯ã¹ããããŸããã³ã³ãã€ã©ãŒãèšç®ãæé©åã§ããªãå Žåã¯ãç¯å²å ã®å€ã«å¯ŸããŠã©ã¡ããéãæ¹ãéžæããå¿ èŠããããšæããŸãã ïŒå€ãç¯å²å ã«ããããšãã³ã³ãã€ã©ãŒãèªèããŠããå Žåãäž¡æ¹ã®ãªãã·ã§ã³ã§åãçµæãåŸããããããåçã«æé©åã§ããŸããïŒ
IntType::max_value()
/ min_value()
ïŒæ¬¡ã®è¡šã¯ãäž¡æ¹ã®ãªãã·ã§ã³ãå®å
šã«æå®ããããšãç®çãšããŠããŸãã T
ã¯ãä»»æã®ãã·ã³æŽæ°åã§ãã TminãšTmaxã¯T::min_value()
ãšT::max_value()
ã§ãã RTZïŒvïŒã¯ãvã®æ°åŠå€ãåãããŒãã«åãã£ãŠäžžããŠæ°åŠæŽæ°ãååŸããããšãæå³ããŸãã
v
| v as T
ïŒåœ©åºŠïŒ| v as T
ïŒã¢ãžã¥ãïŒ
---- | ---- | --------
ç¯å²å
ïŒTmin <= v <= TmaxïŒ| RTZïŒvïŒ| RTZïŒvïŒ
è² ã®ãŒã| 0 | 0
NaN | 0 | 0
ã€ã³ãã£ããã£| Tmax | 0
-ã€ã³ãã£ããã£| Tmin | 0
v> Tmax | Tmax | Tã«åãããã«åãæšãŠãããRTZïŒvïŒ
v <Tmin | Tmin | Tã«åãããã«åãæšãŠãããRTZïŒvïŒ
ECMAScriptæšæºã§ã¯ãæäœToInt32 ãToUint32ãToInt16ãToUint16ãToInt8ãToUint8ãæå®ãããŠããŸããäžèšã®ãã¢ãžã¥ãããªãã·ã§ã³ã®ç®çã¯ããã¹ãŠã®å Žåã«ãããã®æäœãäžèŽãããããšã§ãã
ECMAScriptã¯ãäžèšã®ã©ã¡ãã®å Žåã«ãäžèŽãToInt8Clampãæå®ããŸã
@ oli-obkã®ææ¡ã¯ãç¯å²å ã®å€ã«ã€ããŠãèšç®ãé«éãã©ãããæ€èšãã䟡å€ã®ãã3çªç®ã®æ¹æ³ã§ãã
@ oli-obk笊å·ä»ãæŽæ°åã¯ã©ãã§ããïŒ
å¥ã®ææ¡ãããã¯ã¹ã«æå ¥ããïŒu128ããããŒãã«ãã£ã¹ãããããšãå®å šã§ã¯ãªããšããŒã¯ãã人ã ã«ãããåŠçããæ¹æ³ãæ瀺çã«éžæããããã«åŒ·å¶ããŸãã u128ã¯çŸåšããªããŸãã§ãã
@Manishearthç§ã¯åæ§ã®ã»ãã³ãã£ã¯ã¹æŽæ°âæµ®åå°æ°ç¹æ°ãšããŠæµ®åå°æ°ç¹æ°âæŽæ°ãæãã§ããŸãã ã©ã¡ããUBã«å¯Ÿå¿ããŠãããfloatâintegerãå®å šã§ãªãããããšã¯ã§ããªããããintegerâfloatãå®å šã§ãªããªãããšã¯é¿ããŠãã ããã
floatâintegersaturatingã®å ŽåãAFAICTãé«éã«ãªããŸãïŒ and
ã·ãŒã±ã³ã¹ããã¹ã+ãžã£ã³ããããŒãã®æ¯èŒãšãžã£ã³ãããã¹ãŠææ°ã®ã¢ãŒãã§0.66ãŸãã¯0.5 2-3ãµã€ã¯ã«ã«ãªããŸãïŒã å人çã«ã¯ãç¯å²å
ã®å€ãå¯èœãªéãé«éã§ããéãã決å®ããæ£ç¢ºãªåäœãæ°ã«ããããšã¯ã§ããŸããã§ããã
ãªãŒããŒãããŒã®ããã«åäœãããã®ã¯çã«ããªã£ãŠããŸããïŒ ãããã£ãŠããããã°ãã«ãã§ã¯ãæªå®çŸ©ã®åäœã§ãã£ã¹ããè¡ããšãããã¯ã«ãªããŸãã 次ã«ã 1.04E+17.saturating_cast::<u8>()
ã unsafe { 1.04E+17.unsafe_cast::<u8>() }
ãªã©ã®ãã£ã¹ãåäœãæå®ããããã®ã¡ãœãããäœæã§ããŸãã
ãããåé¡ã¯u128ã ãã«ãããšæã£ãã®ã§ãã©ã¡ãã®æ¹æ³ã§ãå®å šã§ã¯ãããŸããã
@cryze UBã¯ãå®å šãªã³ãŒãã®ãªãªãŒã¹ã¢ãŒãã§ãååšããŠã¯ãªããŸããã ãªãŒããŒãããŒã¯ãŸã å®çŸ©ãããåäœã§ãã
ãšã¯ããããããã°ã§ãããã¯ã«ãªãã
ããã¯ä»¥äžã«åœ±é¿ããŸãïŒ
f32 -> u8, u16, u32, u64, u128, usize
ïŒ -1f32 as _
ãã¹ãŠã®ããã«ã f32::MAX as _
ãã¹ãŠããu128çšïŒf32 -> i8, i16, i32, i64, i128, isize
ïŒãã¹ãŠf32::MAX as _
ïŒf64
->ãã¹ãŠã®intïŒãã¹ãŠf64::MAX as _
ïŒf32::INFINITY as u128
ãUBã§ã
@CryZe
ãªãŒããŒãããŒã®ããã«åäœãããã®ã¯çã«ããªã£ãŠããŸããïŒ ãããã£ãŠããããã°ãã«ãã§ã¯ãæªå®çŸ©ã®åäœã§ãã£ã¹ããè¡ããšãããã¯ã«ãªããŸãã
ããã¯ç§ãæåã«èãããã®ã§ããã as
å€æã¯çŸåšãããã¯ã«ãªãããšã¯ãªãããšãæãåºããŸããïŒè¯ããæªããã as
ã§ãªãŒããŒãããŒãã§ãã¯ãè¡ããŸããïŒã ãããã£ãŠãæãé¡äŒŒããããšã¯ããå®çŸ©ãããäœããè¡ããããšã§ãã
FWIWããkill undefãã¯ãå®éã«ã¯ãã¡ã¢ãªã®å®å šæ§ãä¿®æ£ããæ¹æ³ãæäŸããŸãããçµæã¯é決å®çã§ãã éèŠãªã³ã³ããŒãã³ãã®1ã€ã¯æ¬¡ã®ãšããã§ãã
3ïŒã®äŒæãåæ¢ããæ°ããåœä»€ 'ïŒ y = freezeïŒ x'ãäœæããŸã
æ¯ã å ¥åãpoisonã®å Žåãä»»æã§ããåºå®ãããã
å€ã ïŒå€ãundefãšåæ§ã§ããã䜿çšãããã³ã«
å ¥åå€ãè¿ãã ãã§ãã
undefãä»æ¥ã®ã¡ã¢ãªå®å šæ§ã«éåããããã«äœ¿çšãããçç±ã¯ãundefã䜿çšéãç¹ã«å¢çãã§ãã¯ãšããã«ç¶ããã€ã³ã¿æŒç®ã®éã§å€ãéæ³ã®ããã«å€æŽã§ããããã§ãã å±éºãªãã£ã¹ããè¡ããããã³ã«rustcãããªãŒãºãè¿œå ããå Žåãæªç¥ã®å€ãåŸãããŸããããã以å€ã®å Žåã¯æ£åžžã«åäœããŸãã ãã¡ããããã£ã¹ãã«å¯Ÿå¿ãããã·ã³åœä»€ã¯å€åããå€ã§ã¯ãªãåäžã®å€ãçæãããããããã©ãŒãã³ã¹é¢ã§ã¯ãããªãŒãºã¯åºæ¬çã«ããã§ã¯ç¡æã§ãã ãªããã£ãã€ã¶ãäœããã®çç±ã§ãã£ã¹ãåœä»€ãè€è£œããããšæããå Žåã§ããç¯å²å€ã®å ¥åã®çµæã¯éåžžãç¹å®ã®ã¢ãŒããã¯ãã£ã§æ±ºå®è«çã§ãããããè€è£œããŠãå®å šã§ãã
...ãããã誰ããçåã«æã£ãŠãããšããŠããã¢ãŒããã¯ãã£éã§æ±ºå®è«çã§ã¯ãããŸããã x86ã¯ããã¹ãŠã®äžæ£ãªå ¥åã«å¯ŸããŠ0x80000000ãè¿ããŸãã ARMã¯ç¯å²å€ã®å ¥åã«å¯ŸããŠé£œåããïŒãã®æ¬äŒŒã³ãŒããæ£ããèªãã§ããå ŽåïŒNaNã«å¯ŸããŠ0ãè¿ããŸãã ãããã£ãŠãç®æšã決å®è«çã§ãã©ãããã©ãŒã ã«äŸåããªãçµæãçæããããšã§ããå Žåããã©ãããã©ãŒã ã®fp-to-intçµã¿èŸŒã¿é¢æ°ã䜿çšããã ãã§ã¯ååã§ã¯ãããŸããã å°ãªããšãARMã§ã¯ãã¹ããŒã¿ã¹ã¬ãžã¹ã¿ã§äŸå€ããã§ãã¯ããå¿ èŠããããŸãã ããã¯ããèªäœã«ããããã®ãªãŒããŒãããããããããããŸããããããŠç¢ºãã«çµã¿èŸŒã¿ã䜿çšããããšããŸã ããªãã£ããšããäžãäžã®ã€ãã³ãã§ã®èªåãã¯ãã«åãé²ããŸãã ãŸãã¯ãéåžžã®æ¯èŒæäœã䜿çšããŠç¯å²å ã®å€ãæ瀺çã«ãã¹ãããŠãããéåžžã®float-to-intã䜿çšããããšãã§ããŸãã ãªããã£ãã€ã¶ãŒã®æ¹ããã£ãšããã§ããâŠ
as
ã³ã³ããŒãžã§ã³ã¯çŸåšãããã¯ã«ãªãããšã¯ãããŸãã
ããæç¹ã§ã +
ããããã¯ã«å€æŽããŸããïŒãããã°ã¢ãŒãïŒã 以åã¯UBã ã£ãã±ãŒã¹ã§ã as
ãããã¯ãçºçããŠããã·ã§ãã¯ãåããããšã¯ãããŸããã
ãã§ãã¯ã«é¢å¿ãããå ŽåïŒãããè¡ãå¿
èŠããããŸãïŒã as
éæšå¥šã«ãããïŒãããå¯äžã®è¯ããªãã·ã§ã³ã§ãããŠãŒã¹ã±ãŒã¹ã¯ãããŸããïŒïŒãå°ãªããšãããã䜿çšããªãããã«ã¢ããã€ã¹ãã人ã
ã次ã®ãããªãã®ã«ç§»ãå¿
èŠããããŸãã代ããã«TryFrom
ãšTryInto
䜿çšããŸããããã¯ã as
ããã®ãŸãŸã«ããŠããããšã決å®ããããšãã«ãå
ã«æ»ãäºå®ã§ãããšè¿°ã¹ããã®ã§ãã è°è«ãããŠããã±ãŒã¹ã¯ãæœè±¡çã«ã¯ããã§ãã¯ãè¡ããªãããã«as
ããã§ã«å®çŸ©ãããŠããã±ãŒã¹ãšè³ªçã«ç°ãªããšã¯æããŸããã éãã¯ãå®éã«ã¯ããããã®ã±ãŒã¹ã®å®è£
ã¯çŸåšäžå®å
šã§ãããUBãããããšã§ãã ããªããã«é Œãããšãã§ããªãäžças
ãã§ãã¯ãè¡ãïŒã»ãšãã©ã®çš®é¡ã®ããã«ãããã¯ãªãã®ã§ïŒããããŠããªãã¯ãããã¯ã§ã¯ãªããããã«é Œãããšã¯ã§ããŸããïŒçç±ã¯ããã€ãã®ã¿ã€ãã®ãããããã¯ããïŒãããã³ããã¯äžè²«æ§ããªããç§ãã¡ã¯ãŸã éæšå¥šã§ã¯ãããŸãããç§ã«ãšã£ãŠã¯ããããã¹ãŠã®äžã§ææªã®ããã§ãã
ãããã£ãŠããã®æç¹ã§ã @ jorendorffã¯åºæ¬çã«ãç§ã«ãšã£ãŠæè¯ã®èšç»ã§ãããšæããããã®ãåæã
as
ã«ã¯ã決å®è«çãªåäœããããŸãã圌ã¯3ã€ã®å¯èœæ§ãåæããŸããã æ®ãã®äœæ¥ã¯ããããã®å¯èœæ§ã調æ»ããããšããŸãã¯å°ãªããšããã®ãã¡ã®1ã€ã調æ»ããããšã ãšæããŸãã ã€ãŸããå®éã«å®è£ ããŠããããã©ãã»ã©ãé ããããéããããæãåã£ãŠã¿ãŠãã ããã
ãããåºããããšããã¢ãããŒã·ã§ã³ãæããŠãã人ã¯ããŸããïŒ èª°ããåŒãä»ããããšãæåŸ
ããŠãããã«E-help-wanted
ã¿ã°ãä»ããŸãã ïŒ@ oli-obkïŒïŒ
ãããšãç§ã¯ã¯ãã¹ãã©ãããã©ãŒã ã®äžè²«æ§ã«ä»£åãæãã®ã§ã¯ãªãïŒ/ã¬ããŒãžã€ã³ã§ããã©ã®ã¬ããŒãžãåºããã¯æ°ã«ããŸããïŒãã ãããããã°ã¢ãµãŒã·ã§ã³ã¯éåžžã«åœ¹ç«ã¡ãŸãïŒã
çŸåšãRustã®ãã¹ãŠã®äžžã/åãæšãŠé¢æ°ã¯éåžžã«é
ãããïŒçŽ°å¿ã®æ³šæãas
ãŠæ£ç¢ºã«å®è£
ãããé¢æ°åŒã³åºãïŒã
as
裞ã®cvttss2si
以å€ã®ãã®ã«ããå Žåã¯ãããã ãã®å®å®ãã代æ¿æ段ãè¿œå ããŠãã ããã
@pornelããã¯çè«çãªçš®é¡ã®UBã ãã§ã¯ãªããubã§ããããšãç¡èŠããã°åé¡ã¯ãããŸããããçŸå®ã®äžçã«åœ±é¿ãåãŒããŸãã å®äžçã®ã³ãŒãäŸããïŒ41799ãæœåºããŸããã
@ est31 UBã®ãŸãŸã«ããŠããã®ã¯ééã£ãŠããããšã«åæããŸãããUBã®è§£æ±ºçãšããŠfreeze
ææ¡ãããŠããã®ãèŠãŠããŸããã ãããå®çŸ©ããã決å®è«çå€ã«ããAFAIKãããªãã¯ãã ã©ã¡ããèšãããšãã§ããŸããã ãã®æ¯ãèãã¯ç§ã«ã¯åé¡ãããŸããã
ããšãã°å Žåãç§ã¯å€§äžå€«ãšæããŸãã®ã§ã u128::MAX as f32
決å®è«çã«çæ17.5
x86çãããã³999.0
x86-64ã®äžãããã³-555
ARMäžã
freeze
ã¯ãå®çŸ©ãããã決å®è«çãªãæå®ãããŠããªãå€ãçæããŸããã ãã®çµæã¯äŸç¶ãšããŠãã³ã³ãã€ã©ãŒã奜ãä»»æã®ããããã¿ãŒã³ãã§ãããåãæäœã®äœ¿çšå
šäœã§ã®ã¿äžè²«ããŠããŸãã ããã¯ã人ã
ãäžèšã§åéããUBçæã®äŸãåé¿ããå¯èœæ§ããããŸãããããã¯åŸãããŸããã
f32ãšããŠã®u128 :: MAXã¯ãx86ã§17.5ãx86-64ã§999.0ãARMã§-555ã決å®è«çã«çæããŸããã
ããšãã°ãLLVMãu128::MAX as f32
ããªãŒããŒãããŒãããããfreeze poison
ã«çœ®ãæããããšã«æ°ä»ããå Žåãx86_64ã§ã®fn foo() -> f32 { u128::MAX as f32 }
æå¹ãªåŒãäžãã¯æ¬¡ã®ããã«ãªããŸãã
foo:
ret
ïŒã€ãŸãããªã¿ãŒã³ã¬ãžã¹ã¿ã«æåŸã«ä¿åããããã®ãè¿ãã ãã§ãïŒ
ããã§ããã ããã¯ç§ã®äœ¿çšã«ã¯ãŸã åãå ¥ããããŸãïŒç¯å²å€ã®å€ãæåŸ ããå Žåã¯ãäºåã«ã¯ã©ã³ããè¡ããŸããç¯å²å ã®å€ãæåŸ ãããããã§ã¯ãªãå Žåã¯ãäœããã£ãŠãæ£ããçµæãåŸãããŸããïŒ ã
å€ãããªãŒãºãããŠããéããç¯å²å€ã®ãããŒããã£ã¹ããä»»æã®å€ãè¿ãããšã«åé¡ã¯ãªãã®ã§ããã以äžã®æªå®çŸ©ã®åäœãåŒãèµ·ããããšã¯ãããŸããã
freeze
ãããªãã®ãLLVMã§å©çšã§ããŸããïŒ ããã¯çŽç²ã«çè«çãªæ§æã ãšæããŸããã
@nikomatsakis ïŒ poison
ãšã¯ç°ãªãïŒãã®ããã«äœ¿çšãããã®ãèŠãããšããããŸãã-ããã¯poison / undefã®èšç»ãããæ¹è¯ã§ãã
freeze
ã¯ãä»æ¥ã®LLVMã«ã¯ãŸã£ããååšããŸããã ææ¡ãããã ãã§ãïŒãã®PLDIããŒããŒã¯èªå·±å®çµåã§ãããã¡ãŒãªã³ã°ãªã¹ãã§ãå€ãè°è«ãããŠããŸãïŒã ãã®ææ¡ã«ã¯ããªãã®è³åãåŸãããŠããããã§ããããã¡ãããããæ¡çšãããä¿èšŒã¯ãªããã¿ã€ã ãªãŒã«æ¡çšãããããšã¯ã¯ããã«å°ãªãã§ãã ïŒãã€ã³ã¿ãŒåããã®ãã€ã³ã¿ãŒåã®åé€ã¯äœå¹Žãã®éåãå
¥ããããŠããŸãããããŸã è¡ãããŠããŸãããïŒ
ããã§ææ¡ãããŠããå€æŽã«ã€ããŠããåºç¯ãªè°è«ãåŸãããã«RFCãéãããã§ããïŒ IMOã as
ã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ã®ãããã®ã¯ãã¹ãŠè«äºã«ãªããŸããã人ã
ã«åœŒãã®å£°ãèãããæ©äŒãäžããªããã°ãäºéã«è«äºã«ãªããŸãã
ç§ã¯Juliaéçºè ã§ãããåãLLVMããã¯ãšã³ããå ±æããŠãããããåæ§ã®åé¡ãçºçããŠããããããã®åé¡ããã°ãã远跡ããŠããŸãã èå³ãããå Žåã¯ããããç§ãã¡ã決ãããã®ã§ãïŒç§ã®ãã·ã³ã®åäžã®æ©èœã®ããããã®ã¿ã€ãã³ã°ã§ïŒïŒ
unsafe_trunc(Int64, x)
ã¯ã察å¿ããLLVMçµã¿èŸŒã¿fptosi
ïŒ1.5 nsïŒã«çŽæ¥ããããããŸãtrunc(Int64, x)
ã¯ãç¯å²å€ã®å€ïŒ3 nsïŒã«å¯ŸããŠäŸå€ãã¹ããŒããŸãconvert(Int64, x)
ã¯ãç¯å²å€ãŸãã¯æŽæ°ä»¥å€ã®å€ïŒ6 nsïŒã«å¯ŸããŠäŸå€ãã¹ããŒããŸããŸããã¡ãŒãªã³ã°ãªã¹ãã§æªå®çŸ©ã®æ¯ãèããããå°ãæ確ã«ããããšã«ã€ããŠ
@bstrie RFCã¯åé¡ãããŸããããããŒã¿ããããšééããªã圹ç«ã€ãšæããŸãã ãã ãã@ simonbyrneã®ã³ã¡ã³ãã¯ãã®ç¹ã§éåžžã«åœ¹ç«ã¡ãŸãã
JSã»ãã³ãã£ã¯ã¹ïŒåè¿°ã®ã¢ãžã¥ã@jorendorff ïŒãšã飜åãåã®ããã«èŠããJavaã»ãã³ãã£ã¯ã¹ãããã£ãŠã¿ãŸããã ãããã®ãªã³ã¯ãæéåãã«ãªã£ãå Žåãããã¯JSãšJavaã§ãã
ãŸããRustã§ã®é£œåã®ç°¡åãªå®è£ ãäœæããŸãããããã¯æ£ãããšæããŸãïŒïŒïŒ ãŸããããã€ãã®ãã³ãããŒã¯æ°å€ãååŸããŸããã èå³æ·±ãããšã«ã飜åå®è£ ã¯çµã¿èŸŒã¿ã®å®è£ ãã2ã3åé ãããšã@ simonbyrneã2åé ãã ãã§èŠã€ãããã®ãšã¯ç°ãªããŸãã
Rustã§ãmodãã»ãã³ãã£ã¯ã¹ãå®è£ ããæ¹æ³ãå®å šã«ã¯ããããŸãã...
ããããç§ã«ã¯ãããã©ãŒãã³ã¹ãå¿
èŠãªäººã®ããã«ãå€æ°ã®f32::as_u32_unchecked()
ã¡ãœãããªã©ãå¿
èŠã«ãªãããšã¯æããã§ãã
ããã©ãŒãã³ã¹ãå¿ èŠãªäººã«ã¯ãããããã®
f32::as_u32_unchecked()
ã¡ãœãããªã©ãå¿ èŠã«ãªãããšã¯æããã§ãã
ããã¯æ®å¿µã§ã-ãããšããå®å šã§ãããå®è£ å®çŸ©ã®ããªã¢ã³ããæå³ããŸããïŒ
å®è£ ã§å®çŸ©ãããé«éããã©ã«ãã®ãªãã·ã§ã³ã¯ãããŸãããïŒ
@eddybç§ãã¡ã¯ãã æã£ãŠããã ãããšèããŠããunsafe fn as_u32_unchecked(self) -> u32
ã«f32
äœã«çŽæ¥ã¢ããã°ã§ãããšããã®ãããªas
ä»æ¥ã§ãã
ç§ãæžããRustã®å®è£
ãæé©ã§ãããšã¯æèšã§ããŸãããããã®ã¹ã¬ãããèªããšãã¯ãã»ãšãã©ã®å Žåãé床ããã決å®è«ãšå®å
šæ§ã®æ¹ãéèŠã§ãããšããå°è±¡ãåããŸããã unsafe
ãšã¹ã±ãŒããããã¯ãã§ã³ã¹ã®åããåŽã«ãã人ã®ããã®ãã®ã§ãã
ã§ã¯ããã©ãããã©ãŒã ã«äŸåããå®äŸ¡ãªããªã¢ã³ãã¯ãããŸãããïŒ ç§ã¯éãäœãããäžç¹å®ã®å€ãäžãããšããå¢çã®å€ã§å®å šã§ããããã§ãã äžéšã®å ¥åã«UBã䜿çšããããªãã®ã§ããã£ãšããŸãã§ããã°ãäžè¬çãªäœ¿çšã«ã¯å±éºããããšæããŸãã
ç§ã®ç¥ãéãããã¹ãŠã§ã¯ãªãã«ããŠãã»ãšãã©ã®ãã©ãããã©ãŒã ã§ããã®å€æãå®è£
ããããã®æšæºçãªæ¹æ³ã¯ãUBã§ã¯ãªãç¯å²å€ã®å
¥åã«å¯ŸããŠäœããè¡ããŸãã ããããLLVMã«ã¯ãUBããããã®ãªãã·ã§ã³ïŒãããäœã§ããïŒãéžæããæ¹æ³ããªãããã§ãã LLVMéçºè
ã«ãç¯å²å€ã®å
¥åã§ãæå®ãããŠããªããundef
/ poison
ãçµæãçæããçµã¿èŸŒã¿é¢æ°ãå°å
¥ããããã«èª¬åŸã§ããã°ãããã䜿çšã§ããŸãã
ãããããã®ã¹ã¬ããã®èª°ãã説åŸåã®ããRFCïŒllvm-devãªã¹ãã«ããïŒãäœæããè³åãåŸãŠããããå®è£ ããå¿ èŠããããšç§ã¯æšæž¬ããŸãïŒç§ãã¡ãæ°ã«ããããã¯ãšã³ãã§ããããŠä»ã®ãã©ãŒã«ããã¯å®è£ ã§ã¿ãŒã²ããïŒã llvm-devã«æ¢åã®ãã£ã¹ããéUBã«ãããã説åŸãããããããããç°¡åã§ããïŒãããã«ããCããã³C ++ããã°ã©ã ãé ããªããããªã©ã®è³ªåãåé¿ã§ããããïŒãããã§ãããã»ã©ç°¡åã§ã¯ãããŸããã
ãããããéžæããå Žåã«åããŠïŒ
圩床ïŒç¯å²å€ã®å€ã¯IntType :: max_valueïŒïŒ/ min_valueïŒïŒã«ãªããŸãïŒ
ã¢ãžã¥ãïŒç¯å²å€ã®å€ã¯ãæåã«bigintã«å€æããŠãããåãæšãŠãããšã«ãã£ãŠåŠçãããŸãïŒ
æµ®åå°æ°ç¹ã®çµ¶å¯Ÿç²ŸåºŠã¯å€ã倧ãããªããšããã«äœäžãããããIMOã®ã¿ã®é£œåã¯ããã§ã¯æå³ããããŸãããããã£ãŠãããæç¹ã§ãã¢ãžã¥ãã¯ãã¹ãŠã®ãŒãã®ããã«åœ¹ã«ç«ããªããã®ã«ãªããŸãã
ç§ã¯ãããããŒã¯E-needs-mentor
ãšãããããã¿ã°ä»ãWG-compiler-middle
IMPLæéã¯ããããããã«ã調æ»ãã絶奜ã®æ©äŒã§ãããããããªããšæãããã®ã§ãïŒ èšé²ã®èšç»ã«é¢ããç§ã®æ¢åã®
@nikomatsakis
IIRC LLVMã¯ãæçµçã«freeze
å®è£
ããããšãèšç»ããŠããŸããããã«ããã freeze
å®è¡ããããšã§UBãåŠçã§ããããã«ãªããŸãã
ãããŸã§ã®ç§ã®çµæïŒ https ïŒ
_arrayããªã¢ã³ãã¯ã1024åã®å€ã®ã«ãŒããå®è¡ããŸãã
_castïŒ x as i32
_clipïŒx.minïŒMAXïŒ.maxïŒMINïŒas i32
_panicïŒxãç¯å²å€ã®å Žåã¯ãããã¯ã«ãªããŸã
_zeroïŒç¯å²å€ã®å ŽåãçµæããŒãã«èšå®ããŸã
test bench_array_cast ... bench: 1,840 ns/iter (+/- 37)
test bench_array_cast_clip ... bench: 2,657 ns/iter (+/- 13)
test bench_array_cast_panic ... bench: 2,397 ns/iter (+/- 20)
test bench_array_cast_zero ... bench: 2,671 ns/iter (+/- 19)
test bench_cast ... bench: 2 ns/iter (+/- 0)
test bench_cast_clip ... bench: 2 ns/iter (+/- 0)
test bench_cast_panic ... bench: 2 ns/iter (+/- 0)
test bench_cast_zero ... bench: 2 ns/iter (+/- 0)
ãããããåã ã®æäœã®çµæãæŽæ°ã«äžžããå¿ èŠã¯ãããŸããã æããã«ããããã®2 ns / iterã®èåŸã«ã¯ããã€ãã®éããããã¯ãã§ãã ãããšãã4ã€ã®ããªã¢ã³ããã¹ãŠã§_æ£ç¢ºã«_ 2 nsã®ããã«ãªã£ãŠããŸããïŒ
@ sp-1234éšåçã«æé©åãããŠããã®ã ãããã
@ sp-1234枬å®ããã«ã¯éãããŸãã éã¢ã¬ã€ãã³ãããŒã¯ã¯åºæ¬çã«åœ¹ã«ç«ããªãã
åäžå€é¢æ°ã#[inline(never)]
çµç±ã®é¢æ°ã«åŒ·å¶ãããšã2ns察3nsã«ãªããŸãã
@ arielb1
freeze
ã«é¢ããŠããã€ãäºçŽããããŸãã ç§ãæ£ããç解ããŠããã°ãåçµãããundef
ã¯ä»»æã®å€ãå«ããããšãã§ãã䜿çšããŠãå€åããŸããã å®éã«ã¯ãã³ã³ãã€ã©ã¯ããããã¬ãžã¹ã¿ãŸãã¯ã¹ã¿ãã¯ã¹ããããåå©çšããŸãã
ãã ããããã¯ãåæåãããŠããªãã¡ã¢ãªãå®å šãªã³ãŒãããèªã¿åãããšãã§ããããšãæå³ããŸãã ããã«ãããHeartbleedã®ããã«ãç§å¯ã®ããŒã¿ãæŒæŽ©ããå¯èœæ§ããããŸãã ãããRustã®èŠ³ç¹ããæ¬åœã«UBãšèŠãªããããã©ããã¯è°è«ã®äœå°ããããŸãããæããã«æãŸãããªãããã§ãã
@ s3bkã®ãã³ãããŒã¯ãããŒã«ã«ã§å®è¡ããŸããã ã¹ã«ã©ãŒããŒãžã§ã³ãå®å šã«æé©åãããŠããããšã確èªã§ããŸãããŸããé åããªã¢ã³ãã®asmãçãããã»ã©é©åã«æé©åãããŠããããã«èŠããŸããããšãã°ãã«ãŒãã¯ãã¯ãã«åãããŠããŸãã
æ®å¿µãªããã black_box
ã¹ãã ããããšã¯åœ¹ã«ç«ããªãããã§ãã asmãæçšãªäœæ¥ãè¡ã£ãŠããããšã¯ããããŸããããã³ãããŒã¯ãå®è¡ãããšãã¹ã«ã©ãŒãã³ãããŒã¯ã«å¯ŸããŠäžè²«ããŠ0nsãåŸãããŸãïŒ1nsã瀺ãcast_zero
ãé€ãïŒã @alexcrichtonããã³ãããŒã¯ã§100åæ¯èŒãå®è¡ããããšããœãŒã¹ã³ãŒãïŒïŒ
test bench_cast ... bench: 53 ns/iter (+/- 0)
test bench_cast_clip ... bench: 164 ns/iter (+/- 1)
test bench_cast_panic ... bench: 172 ns/iter (+/- 2)
test bench_cast_zero ... bench: 100 ns/iter (+/- 0)
ã¢ã¬ã€ã®ãã³ãããŒã¯ã¯ãç§ãããããä¿¡é Œããã«ã¯ããŸãã«ãå€æ§ã§ãã ãŸããæ£çŽãªãšãããç§ã¯ãšã«ããtest
ãã³ãããŒã¯ã€ã³ãã©ã¹ãã©ã¯ãã£ã«æççã§ããç¹ã«ã以åã«ååŸãããã©ãããª0nsãšæ¯èŒããŠäžèšã®æ°å€ã確èªããåŸã¯ããã§ãã ããã«ãïŒããŒã¹ã©ã€ã³ãšããŠã®ïŒ black_box(x);
100åã®å埩ã§ã34nsãããããããããã®æ°å€ã確å®ã«è§£éããããšã¯ããã«å°é£ã«ãªããŸãã
泚ç®ã«å€ãã2ã€ã®ãã€ã³ãïŒ
cast_clip
å®è£
ã¯@alexcrichtonã®é£œåãã£ã¹ããããé
ãããã§ãïŒå®è¡ãšç§ã®å®è¡ã®ã¿ã€ãã³ã°ã¯as
ã»ãŒåãã§ããããšã«æ³šæããŠãã ããïŒ cast_panic
ã¯ä»ã®ãã§ãã¯ããããã£ã¹ããããé
ãããšãããããŸãã ãŸããã¢ã¬ã€ãã³ãããŒã¯ã®é床ãããã«äœäžããŠããããšãããããŸãã ãã¶ãããããã®ãã®ã¯ããã€ã¯ãã¢ãŒããã¯ãã£ã®è©³çŽ°ããªããã£ãã€ã¶ã®ã ãŒãã«å€§ããäŸåããŠããŸããïŒèšé²ã®ããã«ãç§ã¯rustc 1.21.0-nightlyïŒd692a91fa 2017-08-04ïŒã -C opt-level=3
ãè»œè² è·ã®i7-6700Kã§æž¬å®ããŸããã
çµè«ãšããŠããããŸã§ã®ãšããä¿¡é Œã§ããããŒã¿ã¯ãªããããä¿¡é Œã§ããããŒã¿ãååŸããã®ã¯é£ããããã«æããããšçµè«ä»ããŠããŸãã ããã«ãå®éã®ã¢ããªã±ãŒã·ã§ã³ãå®æéã®1ïŒ
ã§ããã®æäœã«è²»ãããŠããããšã匷ãçã£ãŠããŸãã ãããã£ãŠã -Z
ãã©ã°ã®èåŸã§ã rustcã«
ç·šéïŒå¯èœã§ããã°ãããŸããŸãªã¢ãŒããã¯ãã£ïŒARMãªã©ïŒããã€ã¯ãã¢ãŒããã¯ãã£ã§ãã®ãããªãã³ãããŒã¯ãå®è¡ããããšããå§ãããŸãã
ç§ã¯ãã³ã«ããŸã詳ãããªãããšãèªããŸããããã®è¡ã¯åŸ®åŠã«ééã£ãŠãããšæããŸãïŒ std::i32::MAX
ïŒ2 ^ 31-1ïŒã¯Float32ãšããŠæ£ç¢ºã«è¡šçŸã§ããªãããã std::i32::MAX as f32
ã¯æãè¿ãè¡šçŸå¯èœãªå€ïŒ2 ^ 31ïŒã«äžžããããŸãã ãã®å€ãåŒæ°x
ãšããŠäœ¿çšãããå Žåãçµæã¯æè¡çã«æªå®çŸ©ã§ãã å³å¯ãªäžçåŒã«çœ®ãæãããšããã®ã±ãŒã¹ãä¿®æ£ãããŸãã
ãããç§ãã¡ã¯ä»¥åãµãŒãã§ãŸãã«ãã®åé¡ãæ±ããŠããŸããã æçµçãªè§£æ±ºçã¯ãf64ã«ãã£ã¹ãããŠããã¯ã©ã³ãããããšã§ããã
ä»ã®è§£æ±ºçããããŸããããããã¯ããªãããªãããŒã§ãããéã¯ãããããŸãåŠçããããã®åªããAPIãå ¬éããŠããŸããã
äžéãšããŠ0x7FFF_FF80i32ã䜿çšãã-0x8000_0000i32ã䜿çšãããšãf64ã«ãã£ã¹ãããã«ããã解決ã§ããŸãã
ç·šéïŒæ£ããå€ã䜿çšããŠãã ããã
0x7fff_ff80
ãæå³ããŠãããšæããŸãããå³å¯ãªäžçåŒã䜿çšããã ãã§ãã³ãŒãã®æå³ãæ確ã«ãªãå¯èœæ§ããããŸãã
x < 0x8000_0000u32 as f32
ïŒ ããã¯ããããè¯ãèãã§ãããã
ææ¡ãããŠãããã¹ãŠã®æ±ºå®è«çãªãã·ã§ã³ã«ã€ããŠèãããšããšã«ããé »ç¹ã«è¡ããããšæãã®ã§ãã¯ã©ã³ãã¯äžè¬çã«æãæçšãªãã®ã§ãã å€æã¿ã€ããå®éã«é£œåç¶æ ã§ãããšææžåãããå Žåãæåã¯ã©ã³ãã¯äžèŠã«ãªããŸãã
ææ¡ãããå®è£ ã¯ãã·ã³åœä»€ã«é©åã«å€æããããåå²ã«å€§ããäŸåããŠãããããç§ã¯å°ãã ãå¿é ããŠããŸãã åå²ãããšãããã©ãŒãã³ã¹ã¯ç¹å®ã®ããŒã¿ãã¿ãŒã³ã«äŸåããŸãã äžèšã®ãã¹ãã±ãŒã¹ã§ã¯ãåãåå²ãåžžã«è¡ãããããã»ããµã«ã¯ä»¥åã®å€ãã®ã«ãŒãå埩ããã®è¯å¥œãªåå²äºæž¬ããŒã¿ãããããããã¹ãŠãïŒæ¯èŒçïŒé«éã«èŠããŸãã çŸå®ã®äžçã¯ãããããã®ããã«ã¯èŠããªãã§ãããã ããã«ãåå²ã¯ãã³ãŒãããã¯ãã«åããã³ã³ãã€ã©ãŒã®æ©èœãæãªããŸãã ç§ã¯@rkruppeã®æèŠã«åæããŸããããã®æäœã¯ããã¯ãã«åãšçµã¿åãããŠãã¹ãããã¹ãã§ã¯ãªããšãããã®ã§ãã é«æ§èœã³ãŒãã§ã¯ãã¯ãã«åãéèŠã§ãããäžè¬çãªã¢ãŒããã¯ãã£ã§åçŽãªãã£ã¹ãããã¯ãã«åã§ããããšã¯éèŠãªèŠä»¶ã§ãã
äžèšã®çç±ã«ããã飜åã»ãã³ãã£ã¯ã¹ãš@simonbyrneã®ä¿®æ£ã䜿çšããè©ŠããŠã¿ãŸããã u16 ã i16 ã i32ã¯ãã¹ãŠãããã«ç°ãªãã±ãŒã¹ãã«ããŒããå¿ èŠããããããããã©ãŒãã³ã¹ãç°ãªããããå®è£ ããŸããã
çµæïŒ
test i16_bench_array_cast ... bench: 99 ns/iter (+/- 2)
test i16_bench_array_cast_clip ... bench: 197 ns/iter (+/- 3)
test i16_bench_array_cast_clip2 ... bench: 113 ns/iter (+/- 3)
test i16_bench_cast ... bench: 76 ns/iter (+/- 1)
test i16_bench_cast_clip ... bench: 218 ns/iter (+/- 25)
test i16_bench_cast_clip2 ... bench: 148 ns/iter (+/- 4)
test i16_bench_rng_cast ... bench: 1,181 ns/iter (+/- 17)
test i16_bench_rng_cast_clip ... bench: 1,952 ns/iter (+/- 27)
test i16_bench_rng_cast_clip2 ... bench: 1,287 ns/iter (+/- 19)
test i32_bench_array_cast ... bench: 114 ns/iter (+/- 1)
test i32_bench_array_cast_clip ... bench: 200 ns/iter (+/- 3)
test i32_bench_array_cast_clip2 ... bench: 128 ns/iter (+/- 3)
test i32_bench_cast ... bench: 74 ns/iter (+/- 1)
test i32_bench_cast_clip ... bench: 168 ns/iter (+/- 3)
test i32_bench_cast_clip2 ... bench: 189 ns/iter (+/- 3)
test i32_bench_rng_cast ... bench: 1,184 ns/iter (+/- 13)
test i32_bench_rng_cast_clip ... bench: 2,398 ns/iter (+/- 41)
test i32_bench_rng_cast_clip2 ... bench: 1,349 ns/iter (+/- 19)
test u16_bench_array_cast ... bench: 99 ns/iter (+/- 1)
test u16_bench_array_cast_clip ... bench: 136 ns/iter (+/- 3)
test u16_bench_array_cast_clip2 ... bench: 105 ns/iter (+/- 3)
test u16_bench_cast ... bench: 76 ns/iter (+/- 2)
test u16_bench_cast_clip ... bench: 184 ns/iter (+/- 7)
test u16_bench_cast_clip2 ... bench: 110 ns/iter (+/- 0)
test u16_bench_rng_cast ... bench: 1,178 ns/iter (+/- 22)
test u16_bench_rng_cast_clip ... bench: 1,336 ns/iter (+/- 26)
test u16_bench_rng_cast_clip2 ... bench: 1,207 ns/iter (+/- 21)
ãã¹ãã¯ãIntel Haswell i5-4570CPUãšRust1.22.0ã§æ¯æ©å®è¡ãããŸããã
clip2
ã¯ãæ°ãããã©ã³ãã¬ã¹å®è£
ã§ãã ããã¯ã2 ^ 32ã®å¯èœãªãã¹ãŠã®f32å
¥åå€ã§clip
ãšäžèŽããŸãã
rng
ãã³ãããŒã¯ã§ã¯ãããŸããŸãªã±ãŒã¹ã«é »ç¹ã«ãããããã©ã³ãã ãªå
¥åå€ã䜿çšãããŸãã ããã«ãããåå²äºæž¬ã倱æããå Žåã«çºçãã_extreme_ããã©ãŒãã³ã¹ã³ã¹ãïŒéåžžã®ã³ã¹ãã®çŽ10å!!!ïŒãæããã«ãªããŸãã ãããèæ
®ããããšã¯_éåžžã«_éèŠã ãšæããŸãã ããã¯å®éã®å¹³åçãªããã©ãŒãã³ã¹ã§ããããŸããããããã§ãå¯èœæ§ã®ããã±ãŒã¹ã§ãããäžéšã®ã¢ããªã±ãŒã·ã§ã³ã¯ããã«ééããŸãã 人ã
ã¯f32ãã£ã¹ããäžè²«ããããã©ãŒãã³ã¹ãæã€ããšãæåŸ
ããã§ãããã
x86ã§ã®ã¢ã»ã³ããªã®æ¯èŒïŒ https ïŒ//godbolt.org/g/AhdF71
ãã©ã³ãã¬ã¹ããŒãžã§ã³ã¯ãminss / maxssåœä»€ã«éåžžã«ããŸããããã³ã°ãããŸãã
æ®å¿µãªãããRustããgodboltã«ARMã¢ã»ã³ããªãçæãããããšã¯ã§ããŸããã§ããããClangãšã®ã¡ãœããã®ARMæ¯èŒã¯æ¬¡ã®ãšããã§ãïŒ https ïŒ//godbolt.org/g/s7ronw
ã³ãŒãããã¹ãã§ãããARMã®å€ããç¥ããªãå ŽåïŒã³ãŒããµã€ãºãå°ããããã«èŠããLLVMã¯ã»ãšãã©ã®å Žåææã«èŠããvmax / vminãçæããŸãã ãã¶ããLLVMã¯ãã³ãŒãã®å€§éšåã1ã€ã®åœä»€ã«æããããããã«æçµçã«æããããã§ããããïŒ
@ActuallyaDeviloper asmãšãã³ãããŒã¯ã®çµæã¯ãšãŠãè¯ãããã§ãïŒ ããã«ãããªãã®ãããªãã©ã³ãã¬ã¹ã³ãŒãã¯ãä»ã®ãœãªã¥ãŒã·ã§ã³ã®ãã¹ããããæ¡ä»¶ãããrustc
ã§çæããæ¹ãããããç°¡åã§ãïŒèšé²ãšããŠãlang itemé¢æ°ãåŒã³åºã代ããã«ã€ã³ã©ã€ã³IRãçæããããšæããŸãïŒã ãããæžããŠãããŠããããšãã
u16_cast_clip2
ã«ã€ããŠè³ªåããããŸãïŒNaNãåŠçããŠããªãããã§ãïŒïŒ NaNã«ã€ããŠã®ã³ã¡ã³ãããããŸãããé¢æ°ã¯NaNãå€æŽããã«ééããã f32
ã«ãã£ã¹ãããããšãããšæããŸãïŒããã§ãªãå Žåã§ãã0ã§ã¯ãªãå¢çå€ã®1ã€ãçæããŸãïŒ ïŒã
PSïŒæ確ã«ããããã«ãç§ã¯ãã£ã¹ãããã¯ãã«åã§ãããã©ãããéèŠã§ãªãããšãæ瀺ããããšããŠããŸããã§ããã åšå²ã®ã³ãŒãããã¯ãã«åå¯èœã§ãããã©ããã¯æããã«éèŠã§ãã ãã ãããã¯ãã«åã¯é©çšã§ããªãããšãå€ããç§ãã³ã¡ã³ããããã³ãããŒã¯ã§ã¯ã¹ã«ã©ãŒããã©ãŒãã³ã¹ã«ã€ããŠäœãè¿°ã¹ãŠããªãã£ããããã¹ã«ã©ãŒããã©ãŒãã³ã¹ãéèŠã§ãã èå³æ·±ãããšã«ã *array*
ãã³ãããŒã¯ã®asmããã§ãã¯ããŠããããããŸã å®è£
ã§ãã¯ãã«åãããŠãããã©ããã確èªããŸãããïŒ
@rkruppeããã§ããç§ã¯èª€ã£ãŠif
ã®åŽé¢ã亀æãããããå¿ããŠããŸããŸããã f32 as u16
ã¯ãããŸããŸäžäœ0x8000ãåãæšãŠãããšã§æ£ããããšãè¡ã£ãããããã¹ãã§ããããæ€åºã§ããŸããã§ããã ä»åã¯ãã©ã³ããå床亀æãããã¹ãŠã®ã¡ãœãããif (y.is_nan()) { panic!("NaN"); }
ãã¹ãããããšã§ãåé¡ãä¿®æ£ããŸããã
以åã®æçš¿ãæŽæ°ããŸããã x86ã³ãŒãã¯ãŸã£ããå€æŽãããŠããŸããããæ®å¿µãªããããã®å€æŽã«ãããäœããã®çç±ã§LLVMãu16
ARMã®å Žåã«vmax
ãçæã§ããªããªããŸãã ããã¯ããã®ARMåœä»€ã®NaNåŠçã«é¢ãã詳现ã«é¢ä¿ããŠãããšæããŸãããããã¯ãLLVMã®å¶éã§ããå¯èœæ§ããããŸãã
ãããæ©èœããçç±ã«ã€ããŠã¯ã笊å·ãªãã®å€ã®äžéå€ãå®éã«ã¯0ã§ããããšã«æ³šæããŠãã ããã ãããã£ãŠãNaNãšäžéãåæã«ãã£ããã§ããŸãã
é
åããŒãžã§ã³ã¯ãã¯ãã«åãããŸãã
ãŽãããã«ãïŒ https ïŒ//godbolt.org/g/HnmsSV
ReïŒ ARM asm ã vmax
ã䜿çšãããªããªã£ãçç±ã¯ãã©ã¡ããã®ãªãã©ã³ããNaNã®å Žåã«NaNãè¿ãããã ãšæãvmovgt
ã以åã®vcmp
ã0ã§åç
§ïŒã
ãããæ©èœããçç±ã«ã€ããŠã¯ã笊å·ãªãã®å€ã®äžéå€ãå®éã«ã¯0ã§ããããšã«æ³šæããŠãã ããã ãããã£ãŠãNaNãšäžéãåæã«ãã£ããã§ããŸãã
ãããããã ãã ãããã
-Zãã©ã°ã®åŸãã§ãrustcã®ãã£ã¹ããšããŠsaturatingãå®è£ ããããšã§åé²ããããšããå§ãããŸã
ç§ã¯ãããå®è£ ããŸãããïŒ41799ãä¿®æ£ããŠããã«å€ãã®ãã¹ããè¡ã£ãããPRãæåºããŸãã
@rkruppe miriãåãå€æŽã§çµããããã«ã@ oli-obkãšèª¿æŽããå¿ èŠããããŸãã
ãã«ãªã¯ãšã¹ããã¢ããããŠããŸãïŒïŒ45205
-Z saturating-float-casts
ãä»ããŠRUSTFLAGS
-Z saturating-float-casts
ãæž¡ãããšã§ã誰ã§ãïŒæ¬¡ã®å€ããïŒé£œåã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ã枬å®ã§ããããã«ãªããŸããã [1]ãã®ãããªæž¬å®ã¯ããã®åé¡ãã©ã®ããã«é²ãããã決å®ããããã«éåžžã«äŸ¡å€ããããŸãã[1]å³å¯ã«èšãã°ãããã¯æšæºã©ã€ãã©ãªã®éãžã§ããªãã¯ãé#[inline]
éšåã«ã¯åœ±é¿ããªãããã100ïŒ
æ£ç¢ºã«ããã«ã¯ãXargoã䜿çšããŠããŒã«ã«ã§stdããã«ãããå¿
èŠããããŸãã ãã ããããã«ãã£ãŠåœ±é¿ãåããã³ãŒããå€ããªããšã¯æããŸããïŒããšãã°ãããŸããŸãªå€æç¹æ§ã®å®è£
ã¯#[inline]
ã§ãïŒã
@rkruppe https://internals.rust-lang.org/t/help-us-benchmark-incremental-compilation/6153/ãšåãããã«ãinternals / usersããŒãžãéå§ããŠããŒã¿ãåéããããšããå§ãã
@rkruppe远跡ã®åé¡ãäœæããå¿ èŠããããŸãã ãã®è°è«ã¯ãã§ã«2ã€ã®åé¡ã«åãããŠããŸãã ããã¯è¯ãããšã§ã¯ãããŸããïŒ
@Gankroã¯ããåæããŸããããã®æçš¿ãé©åã«æžãæéãèŠã€ãããŸã§ã«æ°æ¥ãããå¯èœæ§ãããã®ã§ããã®éã«ãã®åé¡ã賌èªããŠãã人ã ããã®ãã£ãŒãããã¯ãæ±ãããšæããŸããã
@ est31ããŒãã -Zãã©ã°ã¯äž¡æ¹ã®ãã£ã¹ãæ¹åãã«ããŒããŸããïŒæ¯ãè¿ã£ãŠã¿ããšãããã¯ééãã ã£ãå¯èœæ§ããããŸãïŒãäž¡æ¹ã®ã¹ã€ãããåæã«ãªã³ã«ããå¯èœæ§ã¯äœãã2ã€ã®éã«å¿
èŠãªãã®ã®éè€ã¯ã»ãšãã©ãããŸãããè°è«ãããŸãïŒããšãã°ããã®åé¡ã¯é£œåã®ããã©ãŒãã³ã¹ã«äŸåããŸãããïŒ41799ã§ã¯æ£ãã解決çãäœã§ãããã«ã€ããŠåæãããŠããŸãïŒã
äž»ã«ãã®åé¡ã察象ãšãããã³ãããŒã¯ãïŒ41799ã®ä¿®æ£ã®åœ±é¿ã枬å®ããã®ã¯å°ãã°ãããŠããŸããããã
ãã©ã°ã®æçšæ§ããªããªã£ãããã©ã°ãåé€ããã¿ã¹ã¯ã®è¿œè·¡ã®åé¡ãæ€èšããŸãããããããšïŒ41799ã§è¡ãããŠããè°è«ãããŒãžããå¿ èŠã¯ãªããšæããŸãã
å éšæçš¿ãäœæããŸããïŒ https ïŒ
ãããã³ããŒããããç§ãæçš¿ã§ããããã«ã¡ã¢ããã ããã ïŒ const fn
åäœã«ã€ããŠå°ãæ··ä¹±ããŠããããšã«æ³šæããŠãã ããïŒ
ãã1ã€ã®ãã³ãã¯ãfloat-> intå€æã®ã³ã¹ãã¯ãåºæ¬çãªãã®ã§ã¯ãªããçŸåšã®å®è£
ã«åºæã®ãã®ã§ãããšããããšã§ãã x86ã§ã¯ã cvtss2si
cvttss2si
æ»ã£ãŠããŸãã«ãäœã§ã¯0x80000000ãé«ãããããšãã³ã®äŸã§ã¯ã1ãå®è£
ã§ãããã-Zsaturating-float-casts
ãšcvtss2si
cvttss2si
åŸã«0x80000000ã®å Žåã¯ç¹å¥ãªã³ãŒããç¶ããããäžè¬çãªå Žåã¯åäžã®æ¯èŒããã³äºæž¬å¯èœãªãã©ã³ãã§ããå¯èœæ§ããããŸãã ARMã§ã¯ã vcvt.s32.f32
ã¯ãã§ã«-Zsaturating-float-casts
ã»ãã³ãã£ã¯ã¹ããããŸãã LLVMã¯çŸåšãã©ã¡ãã®å Žåãäœåãªãã§ãã¯ãæé©åããŸããã
@Gankro
çŽ æŽããããã©ããããããšãïŒ èŠæšã«ããã€ãã¡ã¢ãæ®ããŸããã ãããèªãã åŸãu128-> f32ãã£ã¹ãã-Zãã©ã°ããåé¢ããããšã«ææŠããããšæããŸãã 2ã€ã®çŽäº€ããç¹åŸŽãã«ããŒããæã«ã€ããŠã®æ°ãæ£ãèŠåãåãé€ãããã ãã«ã
ïŒfloat-> intã®åé¡ã®ã¿ãã«ããŒããããã«-Zãã©ã°ãåãã©ãŒã«ã¹ããããã«ïŒ45900ãæåºããŸããïŒ
ãã¹ãã³ãããŒã¯ãèŠæ±ããåã«ã @ sunfishcode ïŒå°ãªããšãx86ã®å ŽåïŒã§ãã©ãããã©ãŒã åºæã®å®è£ ãååŸã§ããã°äŸ¿å©ã§ãã ããã»ã©é£ããããšã§ã¯ãªãã¯ãã§ãã
åé¡ã¯ãç§ãç¥ãéããLLVMãçŸåšãããè¡ãæ¹æ³ãæäŸããŠããªãããšã§ãããã ãããªãªãŒã¹ã«å¿ ãããæšå¥šããªãã€ã³ã©ã€ã³asmã䜿çšããå Žåãé€ããŸãã
è°è«ãåæ ããããã«ãã©ãããæŽæ°ããŸããïŒåºæ¬çã«ãu128-> f32ã®ã€ã³ã©ã€ã³èšåãæåŸã®è¿œå ã»ã¯ã·ã§ã³ã«ãªããã³ã°ããŸãïŒã
@sunfishcodeããããã§ããïŒ llvm.x86.sse.cvttss2si
ããªããæ¢ããŠãããã®ã§ã¯ãããŸãããïŒ
ããã䜿çšããéã³å Žã®ãªã³ã¯ã¯æ¬¡ã®ãšããã§ãã
https://play.rust-lang.org/?gist=33cf9e0871df2eb2475b845af4f1b574&version=nightly
ãªãªãŒã¹ã¢ãŒãã§ã¯ã float_to_int_with_intrinsic
ãšfloat_to_int_with_as
äž¡æ¹ã1ã€ã®åœä»€ã«ã³ã³ãã€ã«ãããŸãã ïŒãããã°ã¢ãŒãã§ã¯ã float_to_int_with_intrinsic
ã¯ããã€ãã®åœä»€ãç¡é§ã«ããŠãŒããé«å€ã«ããŸãããããã»ã©æªãã¯ãããŸãããïŒ
å®æ°ç³ã¿èŸŒã¿ãæ£ããè¡ãããã§ãã äŸãã°ã
float_to_int_with_intrinsic(42.0)
ã«ãªããŸã
movl $42, %eax
ããããç¯å²å€ã®å€ã
float_to_int_with_intrinsic(42.0e33)
æããããŸããªãïŒ
cvttss2si .LCPI2_0(%rip), %eax
ïŒçæ³çã«ã¯ãå®æ°0x80000000ã«ãã©ãŒã«ãããŸãããããã¯å€§ããããšã§ã¯ãããŸãããéèŠãªããšã¯ãundefãçæããªãããšã§ããïŒ
ãã£ããããã€ã±ãŠãã ããã¯ããŸãããããã§ãïŒ
çµå±ã®ãšããã cvttss2si
åºã¥ããŠæ§ç¯ããæ¹æ³ãããããšãç¥ã£ãŠããã®ã¯çŽ æŽãããããšã§ãã ãã ãããã³ãããŒã¯ãèŠæ±ããåã«ãå®è£
ãå€æŽããŠäœ¿çšããæ¹ãæããã«è¯ããšããããšã«åæããŸããã
ã»ãšãã©ã®äººã¯x86ã§ãã³ãããŒã¯ãè¡ããããx86ãç¹å¥ãªå Žåã«äœ¿çšãããšãäžè¬çãªå®è£ ã«é¢ããããŒã¿ãã¯ããã«å°ãªããªããä»ã®ã»ãšãã©ã®ã¿ãŒã²ããã§åŒãç¶ã䜿çšãããŸãã 確ãã«ãä»ã®ã¢ãŒããã¯ãã£ã«ã€ããŠäœããæšæž¬ããããšã¯ãã§ã«å°é£ã§ããããŸã£ããç°ãªãå®è£ ã«ãããããã¯å®å šã«äžå¯èœã«ãªããŸãã
次ã«ããåçŽãªããœãªã¥ãŒã·ã§ã³ã䜿çšããŠãã³ãããŒã¯ãåéããå®éã®ã³ãŒãã«ããã©ãŒãã³ã¹ã®äœäžããªãããšãããã£ãå ŽåïŒãããŠããããç§ãæåŸ ããŠããããšã§ãïŒã次ã®ããšãè©Šã¿ãæéããããå¿ èŠãããããŸããããã®ã³ãŒããã¹ãããã«æé©åããŸãã
æåŸã«ã cvttss2si
æ§ç¯ãçŸåšãããéããªããã©ããããããããŸããïŒãã ããARMã§ã¯ãé©åãªåœä»€ã䜿çšããæ¹ãæããã«åªããŠããŸãïŒã
ãã³ãããŒã¯ãäœã瀺ããŠãããã«é¢ä¿ãªããå€æ°ã®unsafe fn as_u32_unchecked(self) -> u32
ãšãã®å人ãå¿
èŠã«ãªããšæ³å®ããŠãå®å
šã§ããïŒ åœŒããæžéã芳å¯ããããšã«ãªã£ãå Žåã誰ããä»ã«ã©ã®ãããªæœåšçãªé Œãã«ãªãã§ããããïŒ
@bstrieãã®ãããªå Žåãæ§æãas <type> [unchecked]
æ¡åŒµãã unchecked
ãunsafe
ã®ã¿ååšããããšãèŠæ±ãããããªããšãè¡ãæ¹ãçã«ããªã£ãŠãããšæããŸããã³ã³ããã¹ãã
ç§ãèŠãŠããããã«ã _unchecked
ãã©ã¬ã¹ãã¯ã as
ãã£ã¹ãã®ããªã¢ã³ããšããŠæ©èœããŸããçŽææ§ãšãã¯ãªãŒã³ã§äœ¿çšå¯èœãªããã¥ã¡ã³ãã®çæã®äž¡æ¹ã«é¢ããŠãããŒã«ãªããŸãã
@ssokolowæ§æã®è¿œå ã¯åžžã«æåŸã®æ段ã§ããå¿
èŠããããŸããç¹ã«ãããããã¹ãŠã10åã®æèšé¢æ°ã§åŠçã§ããå Žåã¯ãªãããã§ãã ç¹ã«ã unsafe
ããã¯ã解é€ãããã®ã®æ°ãå¢ããã®ã§ã¯ãªãæžããå¿
èŠããããããäžè¬çãªfoo.as_unchecked::<u32>()
ãæã£ãŠããŠããæ§æã®å€æŽïŒããã³ä»éããéæ¹ããªããã€ã¯ã·ã§ããïŒãããæãŸããã§ãããã
ãã€ã³ãã ã¿ãŒããã£ãã·ã¥ã¯ãªãã·ã§ã³ãæ€èšãããšãã«é ãæ©ãŸããŸãããåŸããèãããšãä»å€ããã¹ãŠã®ã·ãªã³ããŒã§æ£ç¢ºã«çºç ²ããŠããããã§ã¯ãªãã®ã§ãèšèšäžã®æ±ºå®ã«ã€ããŠã³ã¡ã³ãããããšã«ã€ããŠãã£ãšæ éã«ãã¹ãã§ããã
ãšã¯èšããã®ã®ãå®å ã¿ã€ããé¢æ°åã«çŒãä»ããã®ã¯ééã£ãŠãããšæããŸã...ãšã¬ã¬ã³ãã§ã¯ãªããèšèªã®å°æ¥ã®é²åã«æœåšçãªè² æ ããããŸãã ã¿ãŒããã£ãã·ã¥ã¯ããè¯ãéžæè¢ã®ããã«æããŸãã
ãžã§ããªãã¯ã¡ãœããã¯ã unsafe fn
ã¡ãœããã䜿çšããUncheckedFrom
/ UncheckedInto
ç¹æ§ã®æ°ããã»ããã§ãµããŒãããã From
/ Into
ãšTryFrom
/ TryInto
ã³ã¬ã¯ã·ã§ã³ã
@bstrieã³ãŒããé
ããªã£ã人ã®ããã®1ã€ã®ä»£æ¿ãœãªã¥ãŒã·ã§ã³ã¯ãçµã¿èŸŒã¿ïŒstdsimdãªã©ïŒã䜿çšããŠãåºã«ãªãããŒããŠã§ã¢åœä»€ã«ã¢ã¯ã»ã¹ããããšã§ãã ããã«ã¯ãªããã£ãã€ã¶ãŒã®æ¬ ç¹ããããšä»¥åã«äž»åŒµããŸãã-èªåãã¯ãã«åã¯ããããèŠãã¿ãLLVMã¯ãããå©çšããŠç¯å²å€ã®å
¥åã«undef
ãè¿ãããšã¯ã§ããŸãã-ãããããã¯ãªãã§ãã£ã¹ããè¡ãæ¹æ³ãæäŸããŸãå®è¡æã®äœåãªäœæ¥ã ããã§ååãã©ããã¯ããããŸããããå°ãªããšããããããããªããšæãããŸãã
x86åœä»€ã»ããã§ã®å€æã«é¢ãã泚æäºé ïŒ
SSE2ã¯ãå®éã«ã¯ãæäŸããå€ææäœãæ¯èŒçå¶éãããŠããŸãã ããªããæã£ãŠããïŒ
i32
å€æããŸãi64
å€æããŸãïŒx86-64ã®ã¿ïŒi32s
å€æããŸããããã®ããããã«ã¯ã f32
ãšf64
ããªã¢ã³ãããããŸãïŒãŸããåãæšãŠã代ããã«äžžããããªã¢ã³ãããããŸãããããã§ã¯åœ¹ã«ç«ã¡ãŸããïŒã
ãã ãã笊å·ãªãæŽæ°ã«ã¯äœããããŸããã32ããå°ãããµã€ãºã«ã¯äœããããŸããããŸãã32ãããx86ã䜿çšããŠããå Žåã¯ã64ãããã«ã¯äœããããŸããã åŸã®åœä»€ã»ããæ¡åŒµã¯ããå€ãã®æ©èœãè¿œå ããŸããããããã®ããã«ã³ã³ãã€ã«ãã人ã¯ã»ãšãã©ããªãããã§ãã
ãã®çµæãæ¢åã®ïŒãå®å šã§ãªããïŒåäœã¯æ¬¡ã®ããã«ãªããŸãã
fn f32_to_u64(f: f32) -> u64 {
const CUTOFF: f32 = 0x8000000000000000 as f32; // 2^63 exactly
if !(f >= CUTOFF) { // less, or NaN
// just use the signed conversion
f as i64 as u64
} else {
0x8000000000000000u64 + ((f - CUTOFF) as i64 as u64)
}
}
ç¡é¢ä¿ãªé¢çœãäºå®ïŒãåãæšãŠãããå€æãã³ãŒãçæã¯ãã¹ãŒããŒããªãª64ã§ããã©ã¬ã«ãŠãããŒã¹ãã°ãªãããåŒãèµ·ããåå ã§ããè¡çªæ€åºã³ãŒãã¯ãæåã«f32座æšãi32ã«å€æããMIPSåœä»€ã§ã次ã«i16ã«åãæšãŠãŸãã ãããã£ãŠãi16ã«ã¯åãŸããi32ã®ãã©ãããã«ã¯åãŸããªã座æšãããšãã°ã座æš65536.0ã«ç§»åãããšã0.0ã®è¡çªæ€åºãåŸãããŸãã
ãšã«ãããçµè«ïŒ
minss %xmm2, %xmm1
maxss %xmm3, %xmm1
cvttss2si %rax, %xmm1
ãã£ã3ã€ã®åœä»€ïŒé©åãªã³ãŒããµã€ãºãšã¹ã«ãŒããã/ã¬ã€ãã³ã·ãŒãæã£ãŠããŸãïŒã§ããããã©ã³ãã¯ãããŸããã
ããããªããïŒ
2ã€ã®ã¢ãããŒãã®éã®åŠ¥åæ¡ãææ¡ããŸãã
let f = if f > 32767.0 { 32767.0 } else { f };
let f = if f < -32768.0 { -32768.0 } else { f };
cvttss2si(f) as i16
ïŒu / i16ããã³u / i8ã®å Žåãå ã®å€æã¯i32ã«ããããšãã§ããŸããf64ããu / i32ã®å Žåãi64ã«ããå¿ èŠããããŸããïŒ
let r = cvttss2si64(f) as u32;
if f >= 4294967296.0 { 4294967295 } else { r }
ããã€ãã®æ瀺ã§ããããã©ã³ãã¯ãããŸããã
cvttss2si %xmm0, %rcx
ucomiss .LCPI0_0(%rip), %xmm0
movl $-1, %eax
cmovbl %ecx, %eax
let r = cvttss2si64(f);
if f >= 9223372036854775808. {
9223372036854775807
} else if f != f {
0
} else {
r
}
ããã«ãããããé·ãïŒãŸã ãã©ã³ãã®ãªãïŒã·ãŒã±ã³ã¹ãçæãããŸãã
cvttss2si %xmm0, %rax
xorl %ecx, %ecx
ucomiss %xmm0, %xmm0
cmovnpq %rax, %rcx
ucomiss .LCPI0_0(%rip), %xmm0
movabsq $9223372036854775807, %rax
cmovbq %rcx, %rax
âŠãããã f
ãå°ãããããã®ããã«ãåçŽãªã¢ãããŒããšæ¯èŒããŠå°ãªããšã1ã€ã®æ¯èŒãä¿åããŸããããã¯ã0x8000000000000000ããã§ã«æ£è§£ã§ãïŒã€ãŸããi64 :: MINïŒã
f32ããi32ã®å Žåãåãšåãããšãè¡ãã®ãæãŸããã®ãããããšãæåã«f64ã«å€æããŠãããããçãæå°/æ倧ã®ããšãè¡ãã®ãæãŸããã®ãããããªãã
u64
ã¯ãç§ãèããããªãæ··ä¹±ã§ãã ïŒp
ãã³ãããŒã¯ã®åéãã¢ããããŠããŸãïŒ https ïŒ
https://internals.rust-lang.org/t/help-us-benchmark-saturating-float-casts/6231/14ã§ã誰ããç»åã¯ã¬ãŒãã䜿çšããJPEGãšã³ã³ãŒãã£ã³ã°ã®æž¬å®å¯èœã§å€§å¹ ãªé床äœäžãå ±åããŸããã ããã°ã©ã ãæå°åããŠãèªå·±å®çµåã«ããäž»ã«ã¹ããŒããŠã³ã«é¢é£ããéšåã«çŠç¹ãåãããŸããïŒ https ïŒ
ãã£ã¹ãã¯ãf32-> u8ïŒ rgb_to_ycbcr
ïŒãšf32-> i32ïŒ encode_rgb
ããéååãã«ãŒãïŒã®æ¯çãçããããšã«æ³šæããŠãã ããã ãŸããå
¥åããã¹ãŠç¯å²å
ã«ããããã«èŠããŸããã€ãŸãã飜åãå®éã«çºçããããšã¯ãããŸããããf32-> u8ã®å Žåãããã¯ãå€é
åŒã®æå°å€ãšæ倧å€ãèšç®ããäžžã誀差ãèæ
®ããããšã«ãã£ãŠã®ã¿ç¢ºèªã§ããŸãã質åããããšããããããããŸãã f32-> i32ãã£ã¹ãã¯æããã«i32ã®ç¯å²å
ã«ãããŸãããããã¯self.tables
ã®èŠçŽ ããŒã以å€ã§ããããã§ããããã¯ãç¹ã«å
ã®ããã°ã©ã ã§ã¯ããªããã£ãã€ã¶ãŒã衚瀺ããã®ãããã»ã©ç°¡åã§ã¯ãªãããã§ãã tl; drïŒé£œåãã§ãã¯ã¯ãã®ãŸãŸã§ãå¯äžã®åžæã¯ããããé«éåããããšã§ãã
ãŸããLLVM IRãããã€ã調ã¹ãŸãããæåéããå¯äžã®éãã¯ã飜åãã£ã¹ãããã®æ¯èŒãšéžæã§ãã ç°¡åã«èŠããšãasmã«ã¯å¯Ÿå¿ããæ瀺ãããããã¡ãããããå€ãã®ã©ã€ãå€ããããŸãïŒããã«ãããããå€ãã®æµåºãçºçããŸãïŒã
@comex CVTTSS2SIã䜿çšãããšãf32-> u8ããã³f32-> i32ã®ãã£ã¹ããããªãéãã§ãããšæããŸããïŒ
ãã€ããŒã¢ããããŒãã rustc 1.28.0-nightly (952f344cd 2018-05-18)
æç¹ã§ã -Zsaturating-float-casts
ãã©ã°ã䜿çšãããšã httpsïŒ //github.com/rust-lang/rust/issues/10184#issuecomment-345479698ã®ã³ãŒãã¯çŽ20ã«ãªã
| ãã©ã°| ã¿ã€ãã³ã°|
| ------- | -------ïŒ|
| -Copt-level = 3 -Ctarget-cpu = native | 325,699 ns / iterïŒ+/- 7,607ïŒ|
| -Copt-level = 3 -Ctarget-cpu = native -Zsaturating-float-casts | 386,962 ns / iterïŒ+/- 11,601ïŒ
ïŒ19ïŒ
é
ãïŒ|
| -ã³ããã¬ãã«= 3 | 331,521 ns / iterïŒ+/- 14,096ïŒ|
| -Copt-level = 3 -Zsaturating-float-casts | 413,572 ns / iterïŒ+/- 19,183ïŒ
ïŒ25ïŒ
é
ãïŒ|
@kennytm LLVM 6ãäœããå€ããããšãæåŸ ããŠããŸãããïŒ åœŒãã¯ããã®ãŠãŒã¹ã±ãŒã¹ã«åœ¹ç«ã€ç¹å®ã®æ¡åŒµæ©èœã«ã€ããŠè©±ãåã£ãŠããŸããïŒ ãããããªãããã±ããçªå·ã¯äœã§ããïŒ
@insanitybitããã¯...ãŸã éããŠããããã§ã...ïŒ
ãŠã§ã«ããç§ãäœãèŠãŠãããã®æãããã¯ãããŸããã ããããšãïŒ
@rkruppeã¯ãfloat
ïŒããã¥ã¡ã³ããå€æŽããããšã«ããïŒïŒ
2018幎7æ20æ¥4:31 AMããColinã [email protected]ã¯æ¬¡ã®ããã«æžããŠããŸãã
ãŠã§ã«ããç§ãäœãèŠãŠãããã®æãããã¯ãããŸããã
â
ãã®ã¹ã¬ããã«ãµãã¹ã¯ã©ã€ãããŠããããããããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/10184#issuecomment-406462053 ã
ãŸãã¯ãã¥ãŒã
ã¹ã¬ãã
https://github.com/notifications/unsubscribe-auth/AApc0v3rJHhZMD7Kv7RC8xkGOiIhkGB1ks5uITMHgaJpZM4BJ45C
ã
@nagisaãã¶ãããªãã¯f32::from_bits(v: u32) -> f32
ïŒãããŠåæ§ã«f64
ïŒãèããŠããŸããïŒ ä»¥åã¯NaNã®æ£èŠåãè¡ã£ãŠããŸããããçŸåšã¯transmute
ã§ãã
ãã®åé¡ã¯ãæ°å€ãæŠç®ããããšããas
å€æã«é¢ãããã®ã§ãã
@nagisa float-> float castã«ã€ããŠèããŠãããããããŸããã ïŒ15536ââãšãã ããã
ãããã¯ããããã¯ãããŒããããããŒãã§ããã
éã2018幎7æ20æ¥ã«ã¯ãåå12æ24åããã³Kruppeã®[email protected]ã¯æžããŸããïŒ
@nagisa https://github.com/nagisa float-> floatãèããŠãããããããŸãã
ãã£ã¹ããïŒ15536ââhttps ïŒ//github.com/rust-lang/rust/issues/15536ããã³
rust-lang-nursery / nomiconïŒ65
https://github.com/rust-lang-nursery/nomicon/pull/65 ãâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rust-lang/rust/issues/10184#issuecomment-406542903 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/AApc0gA24Hz8ndnYhRXCyacd3HdUSZjYks5uIaHegaJpZM4BJ45C
ã
LLVM7ãªãªãŒã¹ããŒãã«ã¯æ¬¡ã®ãããªèšè¿°ããããŸãã
æµ®åå°æ°ç¹ãã£ã¹ãã®æé©åãæ¹åãããŸããã ããã«ããããªãŒããŒãããŒãããã£ã¹ãã®æªå®çŸ©ã®åäœã«äŸåããŠããã³ãŒãã«é©ãã¹ãçµæãçããå¯èœæ§ããããŸãã é¢æ°å±æ§ "strict-float-cast-overflow" = "false"ãæå®ãããšãæé©åãç¡å¹ã«ã§ããŸãã ãã®å±æ§ã¯ãclangãªãã·ã§ã³-fno-strict-float-cast-overflowã«ãã£ãŠäœæã§ããŸãã ã³ãŒããµãã¿ã€ã¶ãŒã䜿çšããŠã圱é¿ãåãããã¿ãŒã³ãæ€åºã§ããŸãã ãã®åé¡ãåç¬ã§æ€åºããããã®clangãªãã·ã§ã³ã¯-fsanitize = float-cast-overflowã§ãã
ããã¯ãã®åé¡ãšé¢ä¿ããããŸããïŒ
å®å šã§ãªãæªå®çŸ©ã®æ¯ãèãã§ãªãéããLLVMããã£ã¹ãã®ãªãŒããŒãããŒã«å¯ŸããŠäœãããããæ°ã«ããå¿ èŠã¯ãããŸããã äžå¥å šãªåäœãåŒãèµ·ãããªãéããçµæã¯ãŽãã«ãªãå¯èœæ§ããããŸãã
ããã¯ãã®åé¡ãšé¢ä¿ããããŸããïŒ
ãããŸãã UBã¯å€æŽãããŸããã§ãããLLVMã¯ãããæªçšããããšã«ã€ããŠããã«ç©æ¥µçã«ãªããå®éã«åœ±é¿ãåãããããªããŸããããå¥å šæ§ã®åé¡ã¯å€ãããŸããã ç¹ã«ãæ°ããå±æ§ã¯UBãåé€ããããLLVM7ããåã«ååšããŠããæé©åã«åœ±é¿ãäžãããããããšã¯ãããŸããã
@rkruppeã¯å¥œå¥å¿ããããã®çš®ã®https://internals.rust-lang.org/t/help-us-benchmark-saturating-float-casts/6231/14ã¯ååã«ããŸããããå®è£ ã«ã¯ããŸãå€ãã®ãã°ããªãã£ãããã§ãã ããããªããã©ãŒãã³ã¹ã®äœäžãåžžã«äºæ³ãããŠããããã§ãããæ£ããã³ã³ãã€ã«ããããšã¯äŸ¡å€ã®ãããã¬ãŒããªãã®ããã§ãã
ããã¯ãã£ããã·ã¥ã©ã€ã³ãè¶ããŠããã·ã¥ãããã®ãåŸ ã£ãŠããã ãã§ããïŒ ãŸãã¯ãä»ã®æ¢ç¥ã®ãããã«ãŒã¯ãããŸããïŒ
ã»ãšãã©ã®å Žåãç§ã¯ä»ã®ããšã«æ°ãåãããŠå¿ããã§ãããRBG JPEGãšã³ã³ãŒãã£ã³ã°ã®x0.82ååž°ã¯ãããããã§ã¯ãªãã飲ã¿èŸŒãã®ã«ããªãèŠãè¬ã®ããã§ãïŒä»ã®çš®é¡ã®ã¯ãŒã¯ããŒãã¯åœ±é¿ãåããŠããªãããã§ããïŒ ã ããã©ã«ãã§ãµãã¥ã¬ãŒã·ã§ã³ããªã³ã«ããããšã«å察ããã»ã©æ·±å»ã§ã¯ãããŸããããããµãã¥ã¬ãŒã·ã§ã³ãããé«éã§ãããïŒå®å šãªïŒã¬ããŒãžãçæããå¯èœæ§ã®ããå€æé¢æ°ãæäŸããããè©Šãåã«ãèªåã§ãããããã·ã¥ããããšãèºèºããŸãã "åã«èª¬æãããªãã·ã§ã³ã ç§ã¯ããã«å°éããŠããŸããããããŠæããã«ä»ã®èª°ãæã£ãŠããªãã®ã§ãããã¯é端ã«èœã¡ãŸããã
@rkruppeã®ã¢ããããŒãã«æè¬ããŸãã å®å
šãªã¬ããŒãžãªãã·ã§ã³ã®å®è£
ãå®éã«ãããã©ããã¯æ°ã«ãªããŸããïŒ unsafe fn i32::unchecked_from_f32(...)
ãªã©ãç°¡åã«æäŸã§ãããšæ³åã§ããŸãããããã¯å®å
šãªæ©èœã ãšæã£ãŠããããã§ãã ä»æ¥ã®LLVMã§ããã¯å¯èœã§ããïŒ
freeze
ãŸã ãããŸããããã€ã³ã©ã€ã³ã¢ã»ã³ããªã䜿çšããŠãfloatãæŽæ°ã«å€æããããã®ã¿ãŒã²ããã¢ãŒããã¯ãã£ã®åœä»€ã«ã¢ã¯ã»ã¹ããããšãã§ããŸãïŒããšãã°ã飜åas
ãžã®ãã©ãŒã«ããã¯ã䜿çšïŒã ããã«ããäžéšã®æé©åã劚ããããå¯èœæ§ããããŸãããäžéšã®ãã³ãããŒã¯ã§ã¯ã»ãšãã©ã®å Žåååž°ãä¿®æ£ããã®ã«ååãªå ŽåããããŸãã
ãã®åé¡ã®UBãç¶æããïŒãããŠä»æ¥ã®as
ãšåãæ¹æ³ã§ã³ãŒãçæãããïŒ unsafe
é¢æ°ã¯å¥ã®ãªãã·ã§ã³ã§ãããé
åçã§ã¯ãããŸããã dä»äºãæãéããããšãã§ãããªããå®å
šãªæ©èœã奜ãã
ãŸããfloatããintãžã®å®å šãªé£œåã·ãŒã±ã³ã¹ã«ã¯ãŸãã ä»æ¥ã®LLVMã«ã¯ããã«ç¹åãããã®ã¯ãããŸããããã€ã³ã©ã€ã³asmãœãªã¥ãŒã·ã§ã³ãããŒãã«ã«ããå Žåã次ã®ãããªããšãè¡ãã®ã¯é£ãããããŸããã
cvttsd2si %xmm0, %eax # x86's cvttsd2si returns 0x80000000 on overflow and invalid cases
cmp $1, %eax # a compact way to test whether %eax is equal to 0x80000000
jno ok
... # slow path: check for and handle overflow and invalid cases
ok:
ããã¯ã rustcãçŸåšå®è¡ããŠãããã®ãããå€§å¹ ã«é«éã§ããã¯ãã§ãã
ããããŸãããããããšãããããŸãïŒ ã€ã³ã©ã€ã³asmãœãªã¥ãŒã·ã§ã³ã¯ãä»ã®æé©åãé床ã«é»å®³ãããããããã©ã«ããšããŠæ©èœããªããšèããŸããããèªåã§è©Šããããšã¯ãããŸããã ç§ã¯å人çã«ãããã€ãã®åççãªæ¯ãèããå®çŸ©ããããšã«ãã£ãŠããã®äžå¥å šãªç©Žãå¡ãããšãæãã§ããŸãïŒãŸãã«ä»æ¥ã®é£œåãã£ã¹ãã®ããã«ïŒã å¿ èŠã«å¿ããŠãä»æ¥ã®é«é/äžå¥å šãªå®è£ ãå®å šã§ãªãé¢æ°ãšããŠåžžã«ä¿æã§ããŸãããŸããç¡éã®ãªãœãŒã¹ãäžããããæéã®å¶éå ã§ãããã©ã«ããå€§å¹ ã«æ¹åããããä»ã®ç¹æ®ãªå€æé¢æ°ãè¿œå ãããããããšãã§ããŸãïŒç¯å²å€ã®å®å šãªå€æãªã©ïŒ UBã§ã¯ãªããåãªãã¬ããŒãžããããã¿ãŒã³ïŒ
ä»ã®äººã¯ãã®ãããªæŠç¥ã«å察ããã§ããããïŒ ãããŸã§ã®éããããä¿®æ£ããã»ã©éèŠã§ã¯ãªããšæããŸããïŒ
ã€ã³ã©ã€ã³ã¢ã»ã³ããªã¯cvttsd2si
ïŒãŸãã¯åæ§ã®åœä»€ïŒã«èããããã¯ãã ãšæããŸããç¹ã«ãã€ã³ã©ã€ã³asmã¯ã¡ã¢ãªã«ã¢ã¯ã»ã¹ãããå¯äœçšããªãã£ãããããããæªäœ¿çšã®å Žåã¯åé€ã§ããäžéæãªãã©ãã¯ããã¯ã¹ã§ããããã®åšãã®æé©å@ sunfishcodeã飜åã瀺åããã³ãŒãã·ãŒã±ã³ã¹ã«ã€ã³ã©ã€ã³asmã䜿çšããããšã«æççã§ããçç±ã§ãã飜åã®ããã«å°å
¥ããããã§ãã¯ã¯ãåé·ã§ããå Žåãä»æ¥åé€ãããããšããããŸãããã€ã³ã©ã€ã³asmãããã¯ã®ãã©ã³ãã¯åé€ã§ããŸããåçŽåããã
ä»ã®äººã¯ãã®ãããªæŠç¥ã«å察ããã§ããããïŒ ãããŸã§ã®éããããä¿®æ£ããã»ã©éèŠã§ã¯ãªããšæããŸããïŒ
ç§ã¯ä»é£œåç¶æ ã«åãæ¿ããŠãããããåŸã§ä»£æ¿æ¡ãè¿œå ããããšã«å察ããŸãããç§ã¯ããã«ã€ããŠã®ã³ã³ã»ã³ãµã¹ãéŒèããã³ãŒããé ããªã£ããŠãŒã¶ãŒã«ãããæ£åœåããå¿ èŠããã人ã«ãªããããããŸããð
LLVMã§floatãintãã£ã¹ãã«é£œåãããããã®çµã¿èŸŒã¿é¢æ°ãå®è£ ããããã®äœæ¥ãéå§ããŸããïŒ https ïŒ
ãããã©ããã«è¡ãã°ã飜åã»ãã³ãã£ã¯ã¹ãååŸããããã®æ¯èŒçãªãŒããŒãããã®å°ãªãæ¹æ³ãæäŸããŸãã
ãã®æªå®çŸ©ã®æ¯ãèããã©ã®ããã«åçŸããŸããïŒ ã³ã¡ã³ãã®äŸãè©ŠããŸããããçµæã¯255
ãããã¯ãç§ã«ã¯åé¡ãªãããã§ãã
println!("{}", 1.04E+17 as u8);
æªå®çŸ©ã®æ¯ãèãããã®ããã«ç¢ºå®ã«èŠ³å¯ããããšã¯ã§ããŸãããæåŸ ã©ããã®åäœãåŸãããå ŽåããããŸãããããè€éãªç¶æ³ã§ã¯æ©èœããªããªããŸãã
èŠããã«ãç§ãã¡ã䜿çšããã³ãŒãçæãšã³ãžã³ïŒLLVMïŒã¯ããããèµ·ãããªããšæ³å®ããããšãèš±å¯ãããŠããããããã®æ³å®ã«äŸåãããšãäžè¯ã³ãŒããçæãããå¯èœæ§ããããŸãã
@ AaronM04åçŸå¯èœãªæªå®çŸ©ã®åäœã®äŸããæ¬æ¥redditã«
fn main() {
let a = 360.0f32;
println!("{}", a as u8);
let a = 360.0f32 as u8;
println!("{}", a);
println!("{}", 360.0f32 as u8);
}
ïŒéã³å Žãåç §ïŒ
åã®ã³ã¡ã³ããåç §ã@ AaronM04åãã ã£ããšæããŸãã
ãããããããªãããã§ååç°¡åã ã
ç³ãèš³ãããŸããããç§ã¯ãã®6幎éã®åæã®æŽå²ããã¹ãŠæ³šææ·±ãèªã¿ãŸããã ããããçå£ã«ã10ã®ãã¡6ã€ã®é·ã幎!!! ãããããæ¿æ²»å®¶ã®ãã©ãŒã©ã ã ã£ããšãããããã®èŸºãã§çãããããªåŠšå®³è¡çºãäºæ³ãããã§ãããã
ã§ã¯ã誰ããç°¡åãªèšèã§ã解決çãæ¢ãããã»ã¹ã解決çèªäœãããèå³æ·±ããã®ã«ãªãçç±ã説æã§ããŸããïŒ
åœåã®èŠãç®ãããé£ãããLLVMã®å€æŽãå¿ èŠãªããã§ãã
ããããŸãããã2é±ç®ã«ãã®LLVMãäœæããã®ã¯ç¥ã§ã¯ãããŸããã§ãããåãæ¹åã«é²ããšããã®æ ¹æ¬çãªåé¡ã解決ããã®ã«ããã«15幎ãããå¯èœæ§ããããŸãã
æ¬åœã«ã誰ããå·ã€ããããšã«æ³šæãæã£ãŠããŸãããçªç¶å©ããŠãããRustã€ã³ãã©ã¹ãã©ã¯ãã£ã¯åããŠã§ããããã®ã±ãŒã¹ã«ã€ããŠç¥ã£ããšããç§ã¯ãã ã³ã£ããããŸããã
ãã®èª²é¡è¿œè·¡ã·ã¹ãã ã¯ããã®åé¡ã解決ããæ¹æ³ãè°è«ããããã®ãã®ã§ãããæãããªããšãè¿°ã¹ãããšã¯ãã®æ¹åã«é²å±ããããŸããã ãããã£ãŠãåé¡ã®è§£æ±ºãæ¯æŽããããè²¢ç®ããæ°ããæ å ±ãå¿ èŠãªå Žåã¯ãããããŠãã ãããããããªããšãã³ã¡ã³ãã«ãã£ãŠä¿®æ£ãéæ³ã®ããã«è¡šç€ºãããããšã¯ãããŸããã :)
ããã«ã¯LLVMã®å€æŽãå¿ èŠã§ãããšããä»®å®ã¯ææå°æ©ã ãšæããŸãã
æå°éã®ããã©ãŒãã³ã¹ã³ã¹ãã§èšèªã§ãããè¡ãããšãã§ãããšæããŸãã ããã¯* *ããç Žå£å€æŽãããŸããããããè¡ãããšãã§ãããã€å®è¡ããå¿ èŠããããŸãã
ç§ã®è§£æ±ºçã¯ãfloatããintãžã®ãã£ã¹ããunsafe
ãšããŠå®çŸ©ããæšæºã©ã€ãã©ãªã«ããã€ãã®ãã«ããŒé¢æ°ãæäŸããŠã Result
ã¿ã€ãã«ãã€ã³ããããçµæãæäŸããããšã§ãã
ããã¯ã»ã¯ã·ãŒã§ã¯ãªãä¿®æ£ã§ãããé倧ãªå€æŽã§ãããæçµçã«ã¯ãæ¢åã®UBãåé¿ããããã«ãã¹ãŠã®éçºè ãèªåã§ã³ãŒãã£ã³ã°ããå¿ èŠããããŸãã ããã¯æ£ããéã®ã¢ãããŒãã§ãã
@RalfJung ãç§ã«ãããç解ãããŠãããŠããããšãã ç§ã¯èª°ãã䟮蟱ããããçç£çãªãã¬ã€ã³ã¹ããŒãã³ã°ããã»ã¹ã«è»œèçã«ä»å ¥ãããããã€ããã¯ãããŸããã§ããã ãã³ã§æ°ããã®ã§ãããã¯æ¬åœã§ããç§ãã§ããããšã¯ããã»ã©å€ããããŸããã ããã«ãããããããããã¯ç§ãšããããéã³å§ããããšããä»ã®äººãã¡ããã®æªè§£æ±ºã®æ¬ é¥ã«ã€ããŠãã£ãšåŠã³ãé¢é£ããåºåãããã®ãå©ããŸãïŒãã£ãšæ·±ãæãäžãã䟡å€ãããããä»ã®ãšããäœãä»ã®ãã®ãéžã¶æ¹ãè¯ãã§ããïŒ ãããããç§ã®åœ¹ã«ç«ããªãã³ã¡ã³ããã®åé€ãã¯ããã«ç°¡åã«ãªãããšã¯ãã§ã«å¬ããã§ãã
ã¹ã¬ããã®ååã§è¿°ã¹ãããã«ãé¢é£ããããŒã ããã£ãšåã«åæããããã«ãããã¯å¿ èŠãªã»ãã³ãã£ã¯ã¹ããµããŒãããããã«llvmãä¿®æ£ããããšã«ããããã£ãããšããã確å®ã«æ£ããæ¹æ³ã§ä¿®æ£ãããŠããŸãã
ãã®è°è«ã«å®éã«è¿œå ã§ãããã®ã¯ãã以äžãããŸããã
@nikic LLVMåŽã®é²æãåæ»ããŠããããã§ãããå¯èœã§ããã°ç°¡åãªæŽæ°ããé¡ãããŸãã ããããšãã
飜åãã£ã¹ãã¯ããŠãŒã¶ãŒãå¥å šæ§ãåŸãããã«äœããã®åªå ååž°ãè¡ãããšãããšããªãå ŽåããŠãŒã¶ãŒããªããã€ã³ã§ããã©ã€ãã©ãªé¢æ°ãšããŠå®è£ ã§ããŸããïŒ ç§ã¯ã³ã³ãã€ã©ã®å®è£ ãèªãã§ããŸãããããã¯éåžžã«åŸ®åŠãªããã§ãïŒ
-Z
ãã©ã°ãšã¯é¢ä¿ãªãã飜åã®ããã«LLVM IRãçæããçµã¿èŸŒã¿é¢æ°ïŒçŸåšã®ãªãŒãã³ã³ãŒãåãããIRãŸãã¯å°æ¥ã®llvm.fpto[su]i.sat
ïŒãå
¬éã§ããŸãã ããã¯ãŸã£ããé£ããããšã§ã¯ãããŸããã
ãããããããæåã®è¡åãã©ããå¿é
ã§ãã ïŒããïŒïŒé£œåãas
ãã£ã¹ãã®ããã©ã«ãã®ã»ãã³ãã£ã¯ã¹ã«ãªããšããã®ãããªAPIã¯åé·ã«ãªããŸãã ãŸããäžæçãªãã®ã§ãã£ãŠããå¥å
šæ§ãšããã©ãŒãã³ã¹ã®ã©ã¡ããå¿
èŠããèªåã§éžæããå¿
èŠãããããšããŠãŒã¶ãŒã«äŒããã®ã¯çŽ æŽãããããšã§ã¯ãªãããã§ãã
åæã«ãçŸåšã®ç¶æ³ã¯æããã«ããã«æªåããŠããŸãã ã©ã€ãã©ãªAPIã®è¿œå ãæ€èšããŠããå Žåãããã©ã«ãã§é£œåãæå¹ã«ããNaNã«UBããããç¯å²å€ã®æ°å€ãæã€unsafe
çµã¿èŸŒã¿é¢æ°ãæäŸããããã«èŠåããããšããŸããŸãå¢ããŠããŸããã¬ãŒã³ãªfpto[su]i
ïŒã ããã§ãåºæ¬çã«åãéžæè¢ãæäŸãããŸãããããã©ã«ãã§ã¯å¥å
šæ§ãç¶æãããæ°ããAPIã¯å°æ¥åé·ã«ãªãããšã¯ãªãã§ãããã
ããã©ã«ãã§ãµãŠã³ãã«åãæ¿ããã®ã¯è¯ãããšã§ãã ç§ãã¡ã¯ãæåããã§ã¯ãªããèŠæ±ã«å¿ããŠæ¬è³ªçãªãã®ãæ æ°ã«æäŸã§ãããšæããŸãã ãŸãããã®å Žåãconst evalã¯é£œåãè¡ããŸããïŒ ïŒcc @RalfJung @eddyb @ oli -obkïŒ
ç§ãã¡ããã§ã«é£œåç¶æ
ã«ãããäœå¹Žã«ãããã£ãŠããããŠããããšãè©äŸ¡ããŠãã ãããmiriã®åã§ããããæããŸãïŒå€ãllvm::Constant
ããŒã¹ã®ãšããªã¥ãšãŒã¿ãŒã§å€æŽããããšãã¯ã£ãããšèŠããŠããŸãïŒã
@rkruppeçŽ æŽãããïŒ åé¡ã®ã³ãŒãã«ç²ŸéããŠããã®ã§ãããã©ã«ãã®åãæ¿ããå å°ããŸããïŒ
@rkruppe
飜åã®ããã«LLVMIRãçæããçµã¿èŸŒã¿é¢æ°ãå ¬éã§ããŸã
ããã¯ããœãŒã¹ã¿ã€ããšå®å ã¿ã€ãã®çµã¿åããããšã«ã10åãŸãã¯12åã®åå¥ã®çµã¿èŸŒã¿é¢æ°ã§ããå¿ èŠãããå ŽåããããŸãã
@Centril
ããã©ã«ãã§ãµãŠã³ãã«åãæ¿ããã®ã¯è¯ãããšã§ãã ç§ãã¡ã¯ãæåããã§ã¯ãªããèŠæ±ã«å¿ããŠæ¬è³ªçãªãã®ãæ æ°ã«æäŸã§ãããšæããŸãã
ä»ã®ã³ã¡ã³ããšã¯ç°ãªããã³ã¡ã³ãã®ãæ¬è³ªçãªããšã¯ã as
ã飜åç¶æ
ã«ãªã£ããšãã«èšå®ã®ååž°ãå°ãªããã®ãæå³ãããšæããŸãã
ããã¯ãæ¢ç¥ã®é倧ãªååž°ã«å¯ŸåŠããããã®è¯ãã¢ãããŒãã§ã¯ãªããšæããŸãã äžéšã®ãŠãŒã¶ãŒã«ãšã£ãŠã¯ãããã©ãŒãã³ã¹ã®äœäžãå®éã®åé¡ã«ãªãå¯èœæ§ããããŸãããã¢ã«ãŽãªãºã ã«ãã£ãŠå ¥åãåžžã«ç¯å²å ã«ããããšãä¿èšŒãããŸãã ãã®ã¹ã¬ããã«ãµãã¹ã¯ã©ã€ãããŠããªãå Žåã¯ãå€æŽãStableãã£ãã«ã«å°éãããšãã«ã®ã¿åœ±é¿ãåããããšã«æ°ä»ãå¯èœæ§ããããŸãã ãã®æç¹ã§ããªã¯ãšã¹ãã«å¿ããŠå®å šã§ãªãAPIãããã«æäŸãããšããŠãã6ã12é±éã¹ã¿ãã¯ããå¯èœæ§ããããŸãã
ããããéæšå¥šã®èŠåã«å¯ŸããŠãã§ã«ç¢ºç«ãããŠãããã¿ãŒã³ã«åŸãããšããå§ãããŸãã代æ¿ãStableã§ãã°ããå©çšå¯èœã«ãªã£ãåŸã§ã®ã¿ãNightlyã§åãæ¿ããè¡ã£ãŠãã ããã
ããã¯ããœãŒã¹ã¿ã€ããšå®å ã¿ã€ãã®çµã¿åããããšã«ã10åãŸãã¯12åã®åå¥ã®çµã¿èŸŒã¿é¢æ°ã§ããå¿ èŠãããå ŽåããããŸãã
ããã§ããããããªãã¯ç§ãæã«å
¥ããŸããããããç§ã¯ãããã©ã®ããã«é¢é£ããŠãããããããŸãããïŒ 30ã®çµã¿èŸŒã¿é¢æ°ãšããŸããããããããè¿œå ããã®ã¯ããŸã ç°¡åã§ãã ãããå®éã«ã¯ãNåã®èãã©ãããŒã§äœ¿çšãããåäžã®æ±çšçµã¿èŸŒã¿é¢æ°ã䜿çšããæ¹ãããã«ç°¡åã§ãã ã as
ãµãŠã³ããäœæããŠunsafe
ãã£ã¹ãAPIãå°å
¥ããããªãã·ã§ã³ãéžæããŠããæ°å€ã¯å€ãããŸããã
ããã¯ã_æ¢ç¥ã®_é倧ãªååž°ã«å¯ŸåŠããããã®è¯ãã¢ãããŒãã§ã¯ãªããšæããŸãã äžéšã®ãŠãŒã¶ãŒã«ãšã£ãŠã¯ãããã©ãŒãã³ã¹ã®äœäžãå®éã®åé¡ã«ãªãå¯èœæ§ããããŸãããã¢ã«ãŽãªãºã ã«ãã£ãŠå ¥åãåžžã«ç¯å²å ã«ããããšãä¿èšŒãããŸãã ãã®ã¹ã¬ããã«ãµãã¹ã¯ã©ã€ãããŠããªãå Žåã¯ãå€æŽãStableãã£ãã«ã«å°éãããšãã«ã®ã¿åœ±é¿ãåããããšã«æ°ä»ãå¯èœæ§ããããŸãã ãã®æç¹ã§ããªã¯ãšã¹ãã«å¿ããŠå®å šã§ãªãAPIãããã«æäŸãããšããŠãã6ã12é±éã¹ã¿ãã¯ããå¯èœæ§ããããŸãã
+1
ãã¹ãŠã®ãªãªãŒã¹ãã£ãã«ã§èŠåãªããç¶æãããããããã¹ãŠã®ãªãªãŒã¹ãã£ãã«ã§ããã©ãŒãã³ã¹ååž°ã®ãªãç¶æ ãç¶æããããšã®æ¹ãéèŠã§ã¯ãªãããã«æããããããéæšå¥šã®èŠåã®æé ïŒäº€æãå®å®ãããæ¯æ©éæšå¥šã«ããïŒãå¿ èŠãã©ããã¯ããããŸããã ãããããç¹°ãè¿ãã«ãªããŸãããããã«12é±éåŸ ã€ããšã¯ãåºæ¬çã«ããã®åé¡ãã©ã®ãããç¶ããŠããããšããäžžã誀差ã§ãã
-Zsaturating-float-casts
ãã®ãŸãŸã«ããŠããããšãã§ããŸãïŒããã©ã«ããå€æŽããã ãã§ãïŒãããã¯ãå€éã®ãŠãŒã¶ãŒããã°ããã®éãã«ã³ãžãããªããã¢ãŠãã§ããããšãæå³ããŸãã
ïŒã¯ããçµã¿èŸŒã¿é¢æ°ã®æ°ã¯åãªãå®è£ ã®è©³çŽ°ã§ãããäœãã«è³æãŸãã¯å察ããè°è«ãæå³ãããã®ã§ã¯ãããŸããã§ãããïŒ
ç§ã¯ããã®ã³ã¡ã³ãã®ãã¹ãŠãæ¶åããŠãããšäž»åŒµããããšã¯ã§ããŸããããç§ã¯LLVMã¯ããšããå°è±¡ã®äžã§åå@rkruppeä»ãå³ããUBãæé€ãããæççµè·¯ããé»æ¢ããé ç®ãåçµåœä»€ããæã£ãŠããŸã
freeze
ã¯éåžžã«æ°ããã®ã§ãç§ãã¡èªèº«ã®ããŒãžã§ã³ã®LLVMã§ã¯å©çšã§ããªããããããŸãããã ããã§ãããããã2020幎ã®ååã«ãéçºã暡玢ããå¿
èŠãããããã«æãããŸããïŒ
ãã®æç¹ã§ç§ãã¡ã®åžæããéã«ã€ããŠå€§ãŸããªã³ã³ã»ã³ãµã¹ãåŸãããã«ãTã³ã³ãã€ã©äŒè°ã§ã®è°è«ã«æåããŸãã
freeze
ã¯ãããã§åç
§ãããŠãããã¹ãŠã®çç±ãããäŸç¶ãšããŠåé¡ãããfreeze
ã¯ãã©ã³ãã ãªã¬ããŒãžãŸãã¯ç§å¯éµã®ããããæªãæ¹ãè¿ãããšãæåŸ
ããŸãã ïŒç§ã¯ãããã©ããã§ãªã³ã©ã€ã³ã§èªãã§ããŠãèŠçŽãããã®ãæ¬åœã«å¥œãã§ããïŒDïŒ
ãããŠãšã«ãããã©ã³ãã ãªãŽããè¿ãããšã§ããã as
ãã£ã¹ãã«ãšã£ãŠã¯ããªãæªãããã§ãã unchecked_add
ãšåæ§ã«ãå¿
èŠã«å¿ããŠé床ãäžããããã«é«éãªæäœãè¡ãããšã¯çã«ããªã£ãŠããŸããããŸãã
@SimonSapinã¯ãæåã«å察ã®ã¢ãããŒããææ¡ããŸããïŒããã©ã«ãã§ã¯ãäžå¥å š/ãå¥åŠãªãã»ãã³ãã£ã¯ã¹ã«ãªããæ瀺çã«å¥å šãªã¡ãœãããæäŸããŸãïŒã åŸã®ã³ã¡ã³ããããïŒé©åãªç§»è¡æéã®åŸã®ïŒå¥å šæ§ãããã©ã«ãã«ããããšãåçç/ããè¯ããšæããã©ããã¯ããããŸãããïŒ
@pnkfelix
ç§ã¯ãLLVMã«ããªãŒãºåœä»€ããããšããå°è±¡ãåããŠããŸããããã¯ãããã§UBãæé€ããããã®ãæçãã¹ãããããã¯ããã¢ã€ãã ã§ãããã
ããã€ãã®æ³šæç¹ããããŸãã æãéèŠãªããšã¯ãç§ãã¡ãæ°ã«ããŠããã®ãUBãåãé€ãããšã ãã§ããããã³ãã«ãããLLVMãæŽæ°ããŠfreeze
ãå«ããå Žåã§ãïŒãã€ã§ãå®è¡ã§ããŸãïŒãããã€ãã®å€ãããŒãžã§ã³ããµããŒãããŸãïŒç¬éïŒãããŠããã¹ãŠã®ãŠãŒã¶ãŒã®UBãå®éã«åãé€ãã«ã¯ããã©ãŒã«ããã¯ã®å®è£
ãå¿
èŠã§ãã
第äºã«ããã¡ãããç§ãã¡ãæ°ã«ããŠããã®ã¯ãUBã§ã¯ãªããã ããªã®ããšããåé¡ã§ãã ç¹ã«ã freeze(fptosi %x)
ã¯éåžžã«çŽæã«åããåäœãããããšãããäžåºŠåŒ·èª¿ããããšæããŸããããã¯é決å®è«çã§ãããå®è¡ããããã³ã«ç°ãªãçµæïŒ @RalfJungãèšã£ãããã«æ©å¯ã¡ã¢ãªããååŸãããã®ã§ãïŒãè¿ãå¯èœæ§ããããŸãã ä»ã¯ããã«ã€ããŠåã³è°è«ãããã¯ãããŸãããã飜åç¶æ
ãããã©ã«ãã®ãã§ãã¯ãããŠããªãïŒå®å
šã§ãªããŸãã¯freeze
䜿çšããïŒå€æã«ããããã«ããå°ãäœæ¥ãè¡ããã©ãããäŒè°ã§æ€èšãã䟡å€ããããŸãããã©ã«ã以å€ã®ãªãã·ã§ã³ã
@RalfJungç§ã®ç«å Žã§ã¯ã as
ã¯ãå
¥åãšåºåã®ã¿ã€ãã«å¿ããŠã»ãã³ãã£ã¯ã¹ïŒåãæšãŠã飜åãäžžããªã©ïŒã倧ããç°ãªãå¯èœæ§ããããåžžã«ããã§ãããšã¯éããªãããããã®åé¡ã«é¢ä¿ãªãå®å
šã«åé¿ããã®ãæåã§ããã³ãŒããèªããšæããã§ãã ïŒåŸè
ã§ãfoo as _
ã§æšæž¬ã§ããŸããïŒãããã£ãŠã as
ãä»æ¥ïŒãããŠãããããã以äžïŒè¡ãã±ãŒã¹ãã«ããŒãããæ瀺çã«ååãä»ããããããŸããŸãªå€ææ¹æ³ãææ¡ããããã®ãã©ããpre-RFCããããŸãã ã
as
ã¯ã unsafe
å€éšã§äœ¿çšã§ããããã絶察ã«UBãå«ããã¹ãã§ã¯ãªããšæããŸãã ãŽããè¿ãã®ãè¯ããããŸããã ãããããã£ã¹ãã®é£œåã«ãã£ãŠåŒãèµ·ããããããã©ãŒãã³ã¹ã®äœäžã®æ¢ç¥ã®ã±ãŒã¹ã«ã€ããŠã¯ãããããäœããã®ç·©å/移è¡/代æ¿çãå¿
èŠã§ãã ãã®ç§»è¡ã§ãã®ãã©ããRFCããããã¯ããªãããã«ã飜åãã£ã¹ãã®ã©ã€ãã©ãªå®è£
ã«ã€ããŠã®ã¿è³ªåããŸããã
@SimonSapin
ç§ã®ç«å Žã¯ããã®åé¡ã«é¢ä¿ãªãå®å šã«åé¿ããã®ãæåã§ãããšããããšã§ããããã¯ãã»ãã³ãã£ã¯ã¹ïŒåãæšãŠã飜åãäžžããªã©ïŒã倧ããç°ãªãå¯èœæ§ãããããã§ãã
åæããŸããã ããããããã¯ãã®åé¡ã«ã€ããŠã¯å®éã«ã¯åœ¹ã«ç«ã¡ãŸããã
ïŒãŸãã as
ãäžèŠã«ãªãããã«åãçµãã§ããããšãå¬ããæããŸããããã楜ãã¿ã«ããŠããŸããïŒDïŒ
å®å šã§ãªãå Žæã§äœ¿çšã§ããã®ã§ã絶察ã«UBãæã£ãŠã¯ãããªããšæããŸãã ãŽããè¿ãã®ãè¯ããããŸããã ãããããã£ã¹ãã®é£œåã«ãã£ãŠåŒãèµ·ããããããã©ãŒãã³ã¹ã®äœäžã®æ¢ç¥ã®ã±ãŒã¹ã«ã€ããŠã¯ãããããäœããã®ç·©å/移è¡/代æ¿çãå¿ èŠã§ãã ãã®ç§»è¡ã§ãã®ãã©ããRFCããããã¯ããªãããã«ã飜åãã£ã¹ãã®ã©ã€ãã©ãªå®è£ ã«ã€ããŠã®ã¿è³ªåããŸããã
ãããã£ãŠãæçµçãªç¶æ
ã¯ãfloat-to-int as
飜åããããšã§ããããšã«åæããŠããããã§ãã ãããç§ãã¡ãç®æããŠããæçµç®æšã§ããéããç§ã¯ã©ããªç§»è¡èšç»ã«ãæºè¶³ããŠããŸãã
ãã®æçµç®æšã¯ç§ã«ã¯è¯ããšæããŸãã
ããã¯ã_æ¢ç¥ã®_é倧ãªååž°ã«å¯ŸåŠããããã®è¯ãã¢ãããŒãã§ã¯ãªããšæããŸãã äžéšã®ãŠãŒã¶ãŒã«ãšã£ãŠã¯ãããã©ãŒãã³ã¹ã®äœäžãå®éã®åé¡ã«ãªãå¯èœæ§ããããŸãããã¢ã«ãŽãªãºã ã«ãã£ãŠå ¥åãåžžã«ç¯å²å ã«ããããšãä¿èšŒãããŸãã ãã®ã¹ã¬ããã«ãµãã¹ã¯ã©ã€ãããŠããªãå Žåã¯ãå€æŽãStableãã£ãã«ã«å°éãããšãã«ã®ã¿åœ±é¿ãåããããšã«æ°ä»ãå¯èœæ§ããããŸãã ãã®æç¹ã§ããªã¯ãšã¹ãã«å¿ããŠå®å šã§ãªãAPIãããã«æäŸãããšããŠãã6ã12é±éã¹ã¿ãã¯ããå¯èœæ§ããããŸãã
ç§ã®èŠè§£ã§ã¯ããããã®ãŠãŒã¶ãŒã6ã12é±éãrustcã®ã¢ããã°ã¬ãŒããåŸ ã€å Žåãäžçã®çµããã§ã¯ãããŸãããã©ã¡ãã®å Žåããä»åŸã®ãªãªãŒã¹ããäœãå¿ èŠãªãããã©ã€ãã©ãªã«MSRVã®å¶çŽãããå¯èœæ§ããããŸããæ¯æããã
äžæ¹ãã¹ã¬ããã«ãµãã¹ã¯ã©ã€ãããŠããªããŠãŒã¶ãŒã¯ãããã©ãŒãã³ã¹ãäœäžããã®ãšåãããã«ã誀ã³ã³ãã€ã«ãçºçããå¯èœæ§ããããŸãã ã©ã¡ããåªå ããå¿ èŠããããŸããïŒ ç§ãã¡ã¯å®å®æ§ã«ã€ããŠä¿èšŒããå®å šæ§ã«ã€ããŠãä¿èšŒããŸãããç§ã®ç¥ãéããããã©ãŒãã³ã¹ã«ã€ããŠã¯ãã®ãããªä¿èšŒã¯ãããŸããïŒããšãã°ãRFC 1122ã¯perfã«ã€ããŠãŸã£ããèšåããŠããŸããïŒã
ããããéæšå¥šã®èŠåã«å¯ŸããŠãã§ã«ç¢ºç«ãããŠãããã¿ãŒã³ã«åŸãããšããå§ãããŸãã代æ¿ãStableã§ãã°ããå©çšå¯èœã«ãªã£ãåŸã§ã®ã¿ãNightlyã§åãæ¿ããè¡ã£ãŠãã ããã
éæšå¥šã®èŠåã®å Žåãå®å®ãã代æ¿æ段ãèŠã€ãããŸã§éæšå¥šã§åŸ æ©ããçµæã¯ãå°ãªããšãç§ãç¥ãéããåŸ æ©æéäžã®å¥å šæ§ã®ç©Žã§ã¯ãããŸããã ïŒãŸããããã§ã¯çµã¿èŸŒã¿é¢æ°ãæäŸã§ããŸãããäžè¬çãªå Žåãå¥å šæ§ã®ç©Žãä¿®æ£ãããšãã«ä»£æ¿æ¡ãåççã«æäŸã§ããªãå¯èœæ§ããããŸãããããã£ãŠãå®å®çã«ä»£æ¿æ¡ãçšæããããšã¯é£ããèŠä»¶ã§ã¯ãªããšæããŸããïŒ
ããã§ããããããªãã¯ç§ãæã«å ¥ããŸããããããç§ã¯ãããã©ã®ããã«é¢é£ããŠãããããããŸãããïŒ 30ã®çµã¿èŸŒã¿é¢æ°ãšããŸããããããããè¿œå ããã®ã¯ããŸã ç°¡åã§ãã ãããå®éã«ã¯ãNåã®èãã©ãããŒã§äœ¿çšãããåäžã®æ±çšçµã¿èŸŒã¿é¢æ°ã䜿çšããæ¹ãããã«ç°¡åã§ãã ã
as
ãµãŠã³ããäœæããŠunsafe
ãã£ã¹ãAPIãå°å ¥ããããªãã·ã§ã³ãéžæããŠããæ°å€ã¯å€ãããŸããã
ãã®åäžã®æ±çšçµã¿èŸŒã¿é¢æ°ã¯ããããã®12/30åºæã®åçžã€ã³ã¹ã¿ã³ã¹åã®ããã«ã³ã³ãã€ã©ãŒã§åå¥ã®å®è£ ãå¿ èŠãšããŸãããïŒ
LLVMã¯ãã§ã«ã»ãšãã©ã®äœæ¥ãè¡ã£ãŠãããããã³ã³ãã€ã©ã«çµã¿èŸŒã¿é¢æ°ãè¿œå ããã®ã¯ç°¡åãããããŸãããããããå®å šãªã³ã¹ãã«ã¯ã»ã©é ãã§ãã ããã«ãMiriãCraneliftã§ã®å®è£ ãããã³ä»æ§ã§å¿ èŠãšãªãæçµçãªäœæ¥ããããŸãã ãããã£ãŠã誰ããå¿ èŠãšãããªããã£ã³ã¹ã«çµã¿èŸŒã¿é¢æ°ãè¿œå ããã¹ãã§ã¯ãªããšæããŸãã
ããããç§ã¯ããå€ãã®çµã¿èŸŒã¿é¢æ°ãå ¬éããããšã«å察ããŠããŸãããã誰ããããããå¿ èŠãšããå Žåã¯ãææ¡ãè¡ãïŒããšãã°ãããã€ãã®è©³çŽ°ãªèª¬æãå«ãPRãšããŠïŒãããã€ãã®ãã³ãããŒã¯çªå·ãªã©ã§è¿œå ãæ£åœåããå¿ èŠããããŸãã
-Zsaturating-float-casts
ãã®ãŸãŸã«ããŠããããšãã§ããŸãïŒããã©ã«ããå€æŽããã ãã§ãïŒãããã¯ãå€éã®ãŠãŒã¶ãŒããã°ããã®éãã«ã³ãžãããªããã¢ãŠãã§ããããšãæå³ããŸãã
ããã¯ç§ã«ã¯åé¡ãªãããã«æããŸããããã§ã«ãã®ãã©ã°ã䜿çšããŠãã人ã®ã»ãã³ãã£ã¯ã¹ãäžå¥å
šã«ãªãã®ãé¿ããããã«ããã©ã°ã®ååã-Zunsaturating-float-casts
ã«å€æŽããããšããå§ãããŸãã
@Centril
ãã®åäžã®æ±çšçµã¿èŸŒã¿é¢æ°ã¯ããããã®12/30åºæã®åçžã€ã³ã¹ã¿ã³ã¹åã®ããã«ã³ã³ãã€ã©ãŒã§åå¥ã®å®è£ ãå¿ èŠãšããŸãããïŒ
ããããã»ãšãã©ã®å®è£ ã¯ãéä¿¡å ãšå®å ã®ãããå¹ ããã©ã¡ãŒã¿åããããšã§å ±æã§ãããã§ã«å ±æãããŠããŸãã 倧æåãšå°æåãåºå¥ããå¿ èŠãããã®ã¯ã»ãã®æ°ãããã§ãã åãããšãmiriã®å®è£ ã«ãåœãŠã¯ãŸããããããä»ã®å®è£ ãä»æ§ã«ãåœãŠã¯ãŸããŸãã
ïŒç·šéïŒæ確ã«ããããã«ããã®å ±æã¯ãNåã®ç°ãªãçµã¿èŸŒã¿é¢æ°ãããå Žåã§ãçºçããå¯èœæ§ããããŸãããåäžã®æ±çšçµã¿èŸŒã¿é¢æ°ã¯ãçµã¿èŸŒã¿é¢æ°ããšã«å¿ èŠãªãã€ã©ãŒãã¬ãŒããåæžããŸããïŒ
ãããã£ãŠã誰ããå¿ èŠãšãããªããã£ã³ã¹ã«çµã¿èŸŒã¿é¢æ°ãè¿œå ããã¹ãã§ã¯ãªããšæããŸãã
ããããç§ã¯ããå€ãã®çµã¿èŸŒã¿é¢æ°ãå ¬éããããšã«å察ããŠããŸãããã誰ããããããå¿ èŠãšããå Žåã圌ãã¯ææ¡ãè¡ãïŒããšãã°ãããã€ãã®è©³çŽ°ãªèª¬æãå«ãPRãšããŠïŒãããã€ãã®ãã³ãããŒã¯çªå·ãªã©ã§è¿œå ãæ£åœåããå¿ èŠããããŸãã ãã®éããããå¥å šæ§ã®ç©Žã®ä¿®æ£ã劚ããã¹ãã§ã¯ãªããšæããŸãã
ãã§ã«ããã€ãã®ãã³ãããŒã¯æ°å€ããããŸãã ãã£ãšåã®ãã³ãããŒã¯ã®èŠæ±ããããã£ã¹ãã飜åããŠããx86_64ã§ã¯@nikicãåãçµãã LLVMçµã¿èŸŒã¿é¢æ°ïŒã¯ãããæ ¹æ¬çã«å€ããã§ãããã å°æ¥ã«ã€ããŠç¢ºä¿¡ããã®ã¯é£ããã§ãããç§ã®ç¥èã«åºã¥ãæšæž¬ã§ã¯ããã®ããã©ãŒãã³ã¹ãåãæ»ãããã®å¯äžã®ãã£ãšããããæ¹æ³ã¯ã unsafe
å€æãã freeze
ã䜿çšãããã®ãªã©ãç¯å²ãã§ãã¯ãªãã§ã³ãŒããçæãããã®ã䜿çšããããšã§ãã
ããŠãæ¢åã®ãã³ãããŒã¯ã®æ°å€ãããåè¿°ã®çµã¿èŸŒã¿é¢æ°ã«å¯Ÿããç©æ¥µçãªæ¬²æ±ãããããã§ãã ãããããªããç§ã¯æ¬¡ã®è¡åèšç»ãææ¡ããŸãïŒ
#[unstable(...)]
é¢æ°ã䜿çšããŠãæ¯æ©å
¬éãããçµã¿èŸŒã¿é¢æ°ã玹ä»ããŸãã-Zsaturating-float-casts
ãšçŽ¹ä»-Zunsaturating-float-casts
ã-Zsaturating-float-casts
æ©èœã«åãæ¿ããŸãã-Zunsaturating-float-casts
åé€ããŸããããã§ããã çµã¿èŸŒã¿é¢æ°ãäžéšã®ãããªãã¯APIã®å®è£
ã®è©³çŽ°ã§ããããšãé€ããŠãããããf32
ãšf64
ã¡ãœããã§ãã ãããã¯æ¬¡ã®ããããã§ããå¯èœæ§ããããŸãã
str::parse
ããã³FromStr
ãšåæ§ïŒãæã€åºæã®ã¡ãœãããããç§ã¯ã¡ãœãããªã©ãä»ããŠçµã¿èŸŒã¿é¢æ°ãå ¬éããããšãæå³ããŸããã
ååã«ã¿ãŒã²ããã¿ã€ããå«ãŸããè€æ°ã®éãžã§ããªãã¯åºæã¡ãœãã
ããã¯ç§ãã¡ãè¡ãéåžžã®ããšã®ããã«æããŸã-ãã®ãªãã·ã§ã³ã«ç°è°ã¯ãããŸããïŒ
ã§ãïŒ ã¡ãœããã®ååã®äžéšãšããŠïŒçœ²åã®ïŒåã®ååãããå Žåãããã¯ã¢ãããã¯ãªãäžçš®ã®ãå€æïŒ Vec::as_slice
ã[T]::to_vec
ïŒã ãšæãVec::as_slice
ããŸãã¯éããã¿ã€ãã§ã¯ãªãäžé£ã®å€æïŒ to_ne_bytes
ã to_be_bytes
ã to_le_bytes
ïŒã ãããã std::convert
ã®ç¹æ§ã®åæ©ã®äžéšã¯ã u8::to_u16
ã u8::to_u32
ã u8::to_u64
ãªã©ã®æ°åã®åå¥ã®ã¡ãœãããåé¿ããããš
ç§ã®çåã¯ãã¡ãœãããunsafe fn
å¿
èŠãããããšãèãããšããããç¹æ§ã«èªç¶ã«äžè¬åã§ãããã©ããã§ãã åºæã®ã¡ãœãããè¿œå ããå Žåã¯ããã¬ã€ãã®å®è£
ãªã©ã§ãã€ã§ãå§ä»»ã§ããŸãã
å®å
šã§ãªãå€æã®ç¹æ§ãè¿œå ããã®ã¯å¥åŠã«æããŸãããããããSimonã¯ãæµ®åå°æ°ç¹ãšæŽæ°åã®çµã¿åããããšã«ç°ãªãã¡ãœãããå¿
èŠã«ãªãå¯èœæ§ããããšããäºå®ãèããŠãããšæããŸãïŒäŸïŒ f32::to_u8_unsaturated
ã f32::to_u16_unsaturated
ãªã©ïŒã
ç§ãå®å
šã«ç¡ç¥ã§èªãã ããšã®ãªãé·ãã¹ã¬ããã«éãã眮ãã®ã§ã¯ãããŸããããããã¯æãŸããã§ããããããšãu32
ãªã©ã«å€æãããf32::to_integer_unsaturated
ãããã°ååã§ããïŒ å®å
šã§ãªãå€æã®ã¿ãŒã²ããã¿ã€ãã«æãããªéžæã¯ãããŸããïŒ
ããšãã°ãi32 / u32ã«ã®ã¿å®å
šã§ãªãå€æãæäŸãããšãå€ã®ç¯å²ãå³å¯ã«å°ãããªããã¹ãŠã®æŽæ°åãå®å
šã«é€å€ãããŸãããããå¿
èŠã«ãªãå ŽåããããŸãã å°ããããããšïŒJPEGãšã³ã³ãŒãã£ã³ã°ã®ããã«u8ãŸã§ïŒãå¿
èŠã«ãªãããšããããããŸãããããåºãæŽæ°åã«å€æãã as
ïŒéåžžã¯ç¡æã§ã¯ãããŸãããå®äŸ¡ã§ãïŒã§åãæšãŠãããšã§ãšãã¥ã¬ãŒãã§ããŸãã
ããããæ倧ã®æŽæ°ãµã€ãºãžã®å€æã ããæäŸããããšã¯ã§ããŸããã ãããã¯åžžã«ãã€ãã£ãã«ãµããŒããããŠããããã§ã¯ãªãïŒãããã£ãŠãé ãïŒãæé©åã§ä¿®æ£ããããšã¯ã§ããŸãããåŸè ã«ã¯UBïŒLLVM IRïŒããããããã倧ããintã«å€æããŠãããåãæšãŠããããå°ããintã«çŽæ¥å€æãããã«æé©åããã®ã¯é©åã§ã¯ãããŸããã /åãæšãŠæã«å ã®å€æçµæãã©ããã¢ã©ãŠã³ããããå Žåã®ãç°ãªãçµæïŒãã·ã³ã³ãŒãã¬ãã«ãã»ãšãã©ã®ã¢ãŒããã¯ãã£ïŒã
128ãããæŽæ°ãå®çšçã«é€å€ãã64ãããæŽæ°ã«çŠç¹ãåãããŠããäžè¬çãª32ãããã¿ãŒã²ããã«ã¯äŸç¶ãšããŠæªãããšã«æ³šæããŠãã ããã
ç§ã¯ãã®äŒè©±ã¯åããŠã§ãããããã°ã©ãã³ã°ã¯åããŠã§ãã 飜åå€æãšNaNã®ãŒããžã®å€æã劥åœãªããã©ã«ãã®åäœã§ãããšäººã ãèããçç±ã«ã€ããŠèå³ããããŸãã Javaããããè¡ãããšã¯ç解ããŠããŸããïŒã©ããã¢ã©ãŠã³ãã®æ¹ãã¯ããã«äžè¬çã§ããïŒãNaNãå®éã«æ£ããå€æã§ãããšèšããæŽæ°å€ã¯ãããŸããã åæ§ã«ãããšãã°ã1000000.0ã65535ïŒu16ïŒã«å€æããã®ã¯ééã£ãŠããããã§ãã æããã«æ£ããçãã§ããu16ã¯ãããŸããã å°ãªããšãã16960ã«å€æããçŸåšã®åäœãããåªããŠãããšã¯æããŸãããããã¯ãå°ãªããšãC / C ++ãCïŒãgoãªã©ãšå ±æãããåäœã§ãããå°ãªããšãå€å°é©ãããšã§ã¯ãããŸããã
ãªãŒããŒãããŒãã§ãã¯ãšã®é¡äŒŒæ§ã«ã€ããŠã¯è²ã ãªæ¹ããã³ã¡ã³ãããããè³æã§ãã ãŸãããŒãã«ããæŽæ°é€ç®ã«ã䌌ãŠããŸãã ç¡å¹ãªå€æã¯ãç¡å¹ãªç®è¡ãšåãããã«ãããã¯ã«ãªãã¯ãã ãšæããŸãã NaN-> 0ããã³1000000.0-> 65535ïŒãŸãã¯16960ïŒã«äŸåããããšã¯ãæŽæ°ãªãŒããŒãããŒãŸãã¯ä»®æ³ã®n / 0 == 0ã«äŸåããããšãšåãããã«ãšã©ãŒãçºçããããããã«èŠããŸããããã¯ããã©ã«ãã§ãšã©ãŒãçæãããããªãã®ã§ãã ïŒãªãªãŒã¹ãã«ãã§ã¯ãæŽæ°æŒç®ã®å Žåãšåæ§ã«ãéã«ãã£ãŠãšã©ãŒãã§ãã¯ãäžèŠã«ãªãããšããããŸããïŒãŸãããŸãã«ãNaNããŒãã«å€æããããæµ®åå°æ°ç¹ã飜åãããããå Žåã¯ãæŽæ°ãªãŒããŒãããŒãéžæããå¿ èŠããããŸãã
ããã©ãŒãã³ã¹ã«é¢ããŠã¯ãäžè¬çãªããã©ãŒãã³ã¹ãæãé«ãã®ã¯ãåçŽãªå€æãå®è¡ããããŒããŠã§ã¢ã®é害ã«äŸåããããšããæ¥ãããã§ãã ããšãã°ãx86ãšARMã¯ã©ã¡ãããæµ®åå°æ°ç¹ããæŽæ°ãžã®å€æãæ£ããè¡šçŸã§ããªãå ŽåïŒNaNãšç¯å²å€ã®å Žåã®äž¡æ¹ãå«ãïŒã«ããŒããŠã§ã¢äŸå€ãçºçãããŸãã ãã®ãœãªã¥ãŒã·ã§ã³ã¯ãç¡å¹ãªå€æãé€ããŠãŒãã³ã¹ãã§ãããã ãããããã°ãã«ãã§æµ®åå°æ°ç¹ããå°æŽæ°åã«çŽæ¥å€æããå ŽåïŒãŸããªã±ãŒã¹ïŒã¯ãæ¯èŒçå®äŸ¡ã§ããã¯ãã§ãã ïŒãããã®äŸå€ããµããŒãããªãçè«äžã®ããŒããŠã§ã¢ã§ã¯ããœãããŠã§ã¢ã§ãšãã¥ã¬ãŒãã§ããŸããããããã°ãã«ãã§ã®ã¿ãšãã¥ã¬ãŒãã§ããŸããïŒããŒããŠã§ã¢äŸå€ã¯ããŸãã«ä»æ¥ã®ãŒãã«ããæŽæ°é€ç®ã®æ€åºæ¹æ³ã§ãããšæããŸãã LLVMã®è©±ãããããèŠãã®ã§ãããã§å¶çŽãåããŠãããããããŸããããæ¬è³ªçã«ç¡å¹ãªå€æã«å¯ŸããŠçããã代æ¿åäœãæäŸããããã«ããªãªãŒã¹ãã«ãã§ããã¹ãŠã®æµ®åå°æ°ç¹å€æã§ãœãããŠã§ã¢ãšãã¥ã¬ãŒã·ã§ã³ã䜿çšããã®ã¯æ®å¿µã§ãã
@admilazz LLVMã§ã§ããããšã«ã¯å¶çŽããããçŸåšLLVMã¯ãæªå®çŸ©ã®åäœã®ãªã¹ã¯ãªãã«æµ®åå°æ°ç¹æ°ãæŽæ°ã«å¹ççã«å€æããã¡ãœãããå ¬éããŠããŸããã
飜åç¶æ
ã¯ãèšèªãas
ãã£ã¹ããåžžã«æåããããã«å®çŸ©ããŠããããã代ããã«æŒç®åããããã¯ã«å€æŽããããšã¯ã§ããŸããã
åæ§ã«ãããšãã°ã1000000.0ã65535ïŒu16ïŒã«å€æããã®ã¯ééã£ãŠããããã§ãã æããã«æ£ããçãã§ããu16ã¯ãããŸããã å°ãªããšãã16960ã«å€æããçŸåšã®åäœãããåªããŠãããšã¯æããŸããã
ããã¯ç§ã«ã¯æããã§ã¯ãªãã£ãã®ã§ãææãã䟡å€ããããšæããŸãã16960ã¯ã1000000.0ãååãªå¹ ã®æŽæ°ã«å€æãã16åã®äžäœããããä¿æããããã«åãæšãŠãçµæã§ãã
ããã¯ããã®ã¹ã¬ããã§ä»¥åã«ææ¡ããããªãã·ã§ã³ã§ã¯ãªãããïŒç·šéïŒããã§ééã£ãŠãããç³ãèš³ãããŸãããèŠã€ãããŸããã§ããïŒçŸåšã®åäœã§ããããŸããã Rustã®çŸåšã®åäœã¯ãç¯å²å€ã®æµ®åå°æ°ç¹ããæŽæ°ãžã®å€æãæªå®çŸ©ã®åäœã§ãããšãããã®ã§ãã å®éã«ã¯ãããã¯ãã°ãã°ãŽãã®äŸ¡å€ã«ã€ãªãããååãšããŠã誀ã³ã³ãã€ã«ãè匱æ§ãåŒãèµ·ããå¯èœæ§ããããŸãã ãã®ã¹ã¬ããã¯ãããä¿®æ£ããããã®ãã®ã§ãã 以äžã®ããã°ã©ã ãRust1.39.0ã§å®è¡ãããšãæ¯åç°ãªãå€ãåŸãããŸãã
fn main() {
dbg!(1000000.0 as u16);
}
éã³å Žã åºåäŸïŒ
[src/main.rs:2] 1000000.0 as u16 = 49072
å人çã«ã¯ãæŽæ°ã®ãããªåãæšãŠã¯åœ©åºŠãããè¯ããæªãããªããšæããŸããã©ã¡ããç¯å²å€ã®å€ã«å¯ŸããŠæ°å€çã«ééã£ãŠããŸãã UBã§ã¯ãªã決å®è«çã§ããéããééãã®ãªãå€æããã®å Žæãå ããŸãã ã¢ã«ãŽãªãºã ãããå€ãç¯å²å ã«ããããšããã§ã«ç¥ã£ãŠãããããã®ãããªå Žåãæ°ã«ããªããããããŸããã
Result
ãè¿ããã©ãŒã«ãã«ã³ã³ããŒãžã§ã³APIãè¿œå ããå¿
èŠããããšæããŸãããRFC以åã®ãã©ããã®äœæãå®äºããå¿
èŠããããŸã:)
ãæ°åŠæŽæ°ã«å€æããŠãããã¿ãŒã²ããå¹ ã«åãæšãŠãããŸãã¯ãã©ããã¢ã©ãŠã³ããã»ãã³ãã£ã¯ã¹ã¯ããã®ã¹ã¬ããïŒhttps://github.com/rust-lang/rust/issues/10184#issuecomment-299229143ïŒã§ä»¥åã«ææ¡ãã
NaN
ãã©ãããããšããåé¡ã¯æŽæ°ãžã®å€æã«ãšã£ãŠéãåé¡ã§ããã飜åã¯å°ãªããšãç¡é倧ã®ããã«ç¹å¥ãªå€§æåå°æåã®åºå¥ãå¿
èŠãšããŸããïŒã»ãã³ãã£ã¯ã¹ã§ãã»ãšãã©ã®å®è£
ã§ãïŒã ããããã©ããã¢ã©ãŠã³ãã®å Žåãåçã®æŽæ°ã¯+/-ç¡é倧ãšã¯äœã§ããããïŒ JavaScriptã¯ããã0ã ãšèšã£ãŠãããNaNã§as
ãããã¯ãèµ·ãããå Žåãç¡é倧ã§ããããã¯ã«ãªãå¯èœæ§ããããšæããŸãããã©ã¡ãã«ããŠããæ£åžžãªæ°å€ãšéæ£èŠåæ°ãèŠããããã©ããã¢ã©ãŠã³ããé«éåããã®ãé£ãããªãããã§ãäžäººã§ææ¡ããã§ããããå€æã®é£œåã»ãã³ãã£ã¯ã¹ã«ãã£ãŠååž°ãããã³ãŒãã®ã»ãšãã©ã¯ãSIMDã䜿çšããæ¹ããããšæããŸãã ãããã£ãŠãæ®å¿µãªããããã®å€æŽã«ãã£ãŠé«æ§èœã³ãŒãã®èšè¿°ã劚ããããããšã¯ãªãïŒç¹ã«ãç°ãªãã»ãã³ãã£ã¯ã¹ãæã€çµã¿èŸŒã¿ãæäŸãããŠããå ŽåïŒãäžéšã®ãããžã§ã¯ããããé«éãªïŒç§»æ€æ§ãäœãå ŽåïŒå®è£ ã«åããŠåããå¯èœæ§ãããããŸãã
ãããããªããããã€ãã®ããããªããã©ãŒãã³ã¹ã®äœäžã¯ãå¥å šæ§ã®ç©Žãéããããšãé¿ããããã®æ£åœåãšããŠäœ¿çšãããã¹ãã§ã¯ãããŸããã
https://github.com/rust-lang/rust/pull/66841ã¯ãå€ãããã£ãŠããå Žåã«åããŠãLLVMã®fptoui
ããã³fptosi
ã§å€æããunsafe fn
ã¡ãœãããè¿œå ããŸãç¯å²å
ã«ããã飜åããŠããããšã¯ã枬å®å¯èœãªããã©ãŒãã³ã¹ã®äœäžã§ãã
ãã®åŸãããã©ã«ããas
ã«åãæ¿ããïŒãããŠãªããã¢ãŠãããããã«å¥ã®-Z
ãã©ã°ãè¿œå ããïŒã®ã¯åé¡ãªããšæããŸãããããã¯ããããæ£åŒãªLangããŒã ã®æ±ºå®ã§ããã¯ãã§ãã
ãã®åŸãããã©ã«ãã
as
ã«åãæ¿ããïŒãããŠãªããã¢ãŠãããããã«å¥ã®-Z
ãã©ã°ãè¿œå ããïŒã®ã¯åé¡ãªããšæããŸãããããã¯ããããæ£åŒãªLangããŒã ã®æ±ºå®ã§ããã¯ãã§ãã
ã ããç§ãã¡ïŒèšèªããŒã ãå°ãªããšãããã«ãã人ã
ãšïŒã¯https://github.com/rust-lang/lang-team/blob/master/minutes/2019-11-21.mdã§ããã«ã€ããŠè°è«ããŸããæ°ããçµã¿èŸŒã¿é¢æ°ãè¿œå ãã+ -Zunsaturated-float-casts
ãè¿œå ããããšã¯è¯ãæåã®ã¹ãããã§ãã
ãã®äžéšãšããŠããŸãã¯ãã®çŽåŸã«ãå¿ èŠã«å¿ããŠFCPã䜿çšããŠãããã©ã«ããåãæ¿ãããšãããšæããŸãã
æ°ããçµã¿èŸŒã¿é¢æ°ãšã¯ã httpsïŒ//github.com/rust-lang/rust/pull/66841ã®ãããªãã®ãæå³ãããšæã
ããã©ã«ããå€æŽããã«-Z unsaturated-float-casts
ãè¿œå ãããšã¯ã©ãããæå³ã§ããïŒ ããšã©ãŒïŒäžæãªãããã°ãªãã·ã§ã³ããçºè¡ããã®ã§ã¯ãªããno-opãšããŠåãå
¥ããŸããïŒ
æ°ããçµã¿èŸŒã¿é¢æ°ãšã¯ãïŒ66841ã®ãããªãã®ãæå³ãããšæããŸã
ããð-ãããå å°ããŠãããŠããããšãã
ããã©ã«ããå€æŽããã«
-Z unsaturated-float-casts
ãè¿œå ãããšã¯ã©ãããæå³ã§ããïŒ ããšã©ãŒïŒäžæãªãããã°ãªãã·ã§ã³ããçºè¡ããã®ã§ã¯ãªããno-opãšããŠåãå ¥ããŸããïŒ
ããåºæ¬çã«ã ãŸããæã
ã¯åé€-Z saturated-float-casts
ã®è³æã§-Z unsaturated-float-casts
ãšçŽæ¥ããã©ã«ãã®åãæ¿ãããããã¯å°ãªãã®PRãè¶
ããåãçµæã«ã€ãªããã¯ãã§ãã
ç§ã¯ãäžé£œåãã®ææ¡ãæ¬åœã«ç解ããŠããŸããã æ°ããããã©ã«ãããªããã¢ãŠãããããã®ãããæäŸããããšãç®æšã§ããå Žåã¯ãæ¢åã®ãã©ã°ã®ããã©ã«ããå€æŽããã ãã§ããã以äžäœãããªãæ¹ãç°¡åã§ãã ãã¬ãŒããªãïŒäžå¥å
šïŒã«ã€ããŠããæ確ãªæ°ããååãéžæããããšãç®æšã§ããå Žåããäžé£œåãã¯ããã§ã²ã©ãã§ãâ代ããã«ãå®å
šã§ãªãããŸãã¯ãUBããŸãã¯åæ§ã®ãã®ãå«ãååãææ¡ããŸãæãèšèãäŸãã°-Z fix-float-cast-ub
ã
unchecked
ã¯ãAPIåã«ããã€ãã®åäŸãããçšèªã§ãã
@admilazz LLVMã§ã§ããããšã«ã¯å¶çŽããããçŸåšLLVMã¯ãæªå®çŸ©ã®åäœã®ãªã¹ã¯ãªãã«æµ®åå°æ°ç¹æ°ãæŽæ°ã«å¹ççã«å€æããã¡ãœãããå ¬éããŠããŸããã
ãã ããæŽæ°ãªãŒããŒãããŒã®å Žåãšåæ§ã«ããããã°ãã«ãã§ã®ã¿ã©ã³ã¿ã€ã ãã§ãã¯ãè¿œå ã§ãããšæãããŸãã
ã©ããã¢ã©ãŠã³ãã»ãã³ãã£ã¯ã¹ã奜ãå¯äžã®çç±ã¯ããœãããŠã§ã¢ãšãã¥ã¬ãŒã·ã§ã³ã®å¹çã§ãã
ã©ã¡ããééã£ãŠããã®ã§ãã©ããã¢ã©ãŠã³ããšãµãã¥ã¬ãŒã·ã§ã³ã®ã©ã¡ãããéžã¶ã¹ãã§ã¯ãªããšæããŸãããã©ããã¢ã©ãŠã³ãã«ã¯ãå°ãªããšãrustã«äŒŒãå€ãã®èšèªã§äœ¿çšãããæ¹æ³ã§ãããšããå©ç¹ããããŸãïŒC / C ++ãCïŒãgoãããããDããããŠç¢ºãã«ããå€ãããããŠãŸãéã®çŸåšã®æ¯ãèãã§ããïŒå°ãªããšãæã ïŒã ãšã¯ãããæŽæ°ãªãŒããŒãããŒããŒãé€ç®ãªã©ã®ç¡å¹ãªæŒç®ã®å Žåãšåãããã«ããç¡å¹ãªå€æã§ã®ãããã¯ïŒãããããããã°ãã«ãã®ã¿ïŒããçæ³çã ãšæããŸãã
ïŒèå³æ·±ãããšã«ãç§ã¯éã³å Žã§16960ãååŸããŸãããããããæçš¿ãããä»ã®äŸãããéãç°ãªãå ŽåãããããšãããããŸã...ïŒ
飜åç¶æ ã¯ãèšèªãåžžã«æåãããã£ã¹ããšããŠå®çŸ©ãããŠããããã代ããã«æŒç®åããããã¯ã«å€æŽããããšã¯ã§ããŸããã
æäœã®è©äŸ¡å¯Ÿè±¡ãå€æŽããããšã¯ããã§ã«ãããè¡ã£ãŠãã人ã ã®çµæãæ°ã«ããéãããã§ã«é倧ãªå€æŽã§ãã ãã®ãããã¯ã®ãªãåäœãå€ããå¯èœæ§ããããŸãã
NaNã§ãããã¯ã«ãªã£ãå Žåãç¡é倧ã§ããããã¯ã«ãªãå¯èœæ§ããããšæããŸãããã©ã¡ãã«ããŠããã©ããã¢ã©ãŠã³ããé«éåããã®ãé£ãããªãããã§ãã
æŽæ°ãªãŒããŒãããŒã®ããã«ããããã°ãã«ãã§ã®ã¿ãã§ãã¯ãããå Žåã¯ãäž¡æ¹ã®é·æã掻çšã§ãããšæããŸããå€æã¯æ£ããããšãä¿èšŒãããŠããïŒãããã°ãã«ãã§ã¯ïŒããŠãŒã¶ãŒãšã©ãŒãæ€åºãããå¯èœæ§ãé«ãããããªããã€ã³ã§ããŸããå¿ èŠã«å¿ããŠãã©ããã¢ã©ãŠã³ãããµãã¥ã¬ãŒã·ã§ã³ãªã©ã®å¥åŠãªåäœãè¡ããããã©ãŒãã³ã¹ã¯å¯èœãªéãè¯å¥œã§ãã
ãŸããã³ãã³ãã©ã€ã³ã¹ã€ãããä»ããŠãã®ãããªãã®ãå¶åŸ¡ããã®ã¯å¥åŠã«æããŸãã ããã¯å€§ããªãã³ããŒã§ãã 確ãã«ãç¯å²å€ã®å€æã®æãŸããåäœã¯ã¢ã«ãŽãªãºã ã®è©³çŽ°ã«äŸåãããããå€æããšã«å¶åŸ¡ããå¿ èŠããããŸãã f.to_u16_satïŒïŒããã³f.to_u16_wrapïŒïŒãŸãã¯ãªããã€ã³ãšåæ§ã®ãã®ããå§ãããŸããã³ãŒãã®ã»ãã³ãã£ã¯ã¹ãå€æŽããã³ãã³ãã©ã€ã³ãªãã·ã§ã³ã¯ãããŸããã ããã¯ãç°ãªãã³ãŒããæ··ãåãããŠäžèŽãããã®ãé£ãããããããèªãã§äœããäœãããã®ãç解ããããšã¯ã§ããŸãã...
ãŸãããç¡å¹ãªå Žåã¯ãããã¯ããããã©ã«ãã®åäœã«ããããšãæ¬åœã«åãå ¥ããããªãå Žåã¯ããããå®è£ ãããããããã°ãã«ãã§ã®ã¿æå¹æ§ãã§ãã¯ãå®è¡ããçµã¿èŸŒã¿ã¡ãœããããããšäŸ¿å©ã§ããããã«ãããïŒåºå€§ãªïŒå€æãæ£ããããšã確èªã§ããŸãã倧å€æ°ïŒïŒå€æåŸã«åãæ°ãååŸããããšãæåŸ ããŠãããããªãªãŒã¹ãã«ãã§ããã«ãã£ãæ¯æããªãå Žåã
èå³æ·±ãããšã«ãç§ã¯éã³å Žã§16960ãååŸããŸããã
ãããæªå®çŸ©ã®æ¯ãèãã®ä»çµã¿ã§ããããã°ã©ã ã®æ£ç¢ºãªå®åŒåãæ£ç¢ºãªã³ã³ãã€ã©ããŒãžã§ã³ãããã³æ£ç¢ºãªã³ã³ãã€ã«ãã©ã°ã«ãã£ãŠã¯ã決å®è«çãªæ¯ãèããå®è¡ããšã«å€åããã¬ããŒãžå€ããŸãã¯èª€ã³ã³ãã€ã«ãçºçããå¯èœæ§ããããŸãã ã³ã³ãã€ã©ã¯äœã§ãã§ããŸãã
ã©ããã¢ã©ãŠã³ãã«ã¯ãå°ãªããšãrustã«äŒŒãå€ãã®èšèªã§äœ¿çšãããæ¹æ³ã§ãããšããå©ç¹ããããŸãïŒC / C ++ãCïŒãgoãããããDããããŠç¢ºãã«ãã以äžã
æ¬åœã«ïŒ å°ãªããšãCãšC ++ã§ã¯ãRustãšåãæªå®çŸ©ã®åäœããããŸãã ããã¯å¶ç¶ã§ã¯ãããŸãããäž»ã«Cããã³C ++ãå®è£ ããclangçšã«æ§ç¯ãããLLVMã䜿çšããŸãã CïŒã«ã€ããŠããããã§ããïŒ
C11æšæºhttps://port70.net/~nsz/c/c11/n1570.html#6.3.1.4
å®éã®æµ®ååã®æéå€ã_Bool以å€ã®æŽæ°åã«å€æããããšãå°æ°éšåã¯ç Žæ£ãããŸãïŒã€ãŸããå€ã¯ãŒãã«åãã£ãŠåãæšãŠãããŸãïŒã æŽæ°éšåã®å€ãæŽæ°åã§è¡šãããšãã§ããªãå Žåãåäœã¯å®çŸ©ãããŠããŸããã
æŽæ°åã®å€ã笊å·ãªãåã«å€æããããšãã«å®è¡ãããæ®ãã®æŒç®ã¯ãå®éã®æµ®ååã®å€ã笊å·ãªãåã«å€æããããšãã«å®è¡ããå¿ èŠã¯ãããŸããã ãããã£ãŠãããŒã¿ãã«å®æµ®åå€ã®ç¯å²ã¯ïŒ-1ãUtype_MAX + 1ïŒã§ãã
C ++ 17æšæºhttp://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4659.pdf#section.7.10
æµ®åå°æ°ç¹åã®prvalueã¯ãæŽæ°åã®prvalueã«å€æã§ããŸãã å€æã¯åãæšãŠãããŸããã€ãŸããå°æ°éšåã¯ç Žæ£ãããŸãã åãæšãŠãããå€ãå®å ã¿ã€ãã§è¡šãããšãã§ããªãå Žåãåäœã¯æªå®çŸ©ã§ãã
CïŒãªãã¡ã¬ã³ã¹https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/numeric-conversions
doubleãŸãã¯floatå€ãæŽæ°åã«å€æãããšããã®å€ã¯ãŒãã«åãã£ãŠæãè¿ãæŽæ°å€ã«äžžããããŸãã çµæã®æŽæ°å€ãå®å ã¿ã€ãã®ç¯å²å€ã§ããå Žåãçµæã¯ãªãŒããŒãããŒãã§ãã¯ã³ã³ããã¹ãã«äŸåããŸãã ãã§ãã¯ãããã³ã³ããã¹ãã§ã¯ãOverflowExceptionãã¹ããŒãããŸããããã§ãã¯ãããŠããªãã³ã³ããã¹ãã§ã¯ãçµæã¯å®å ã¿ã€ãã®æªæå®ã®å€ã«ãªããŸãã
ã€ãŸããUBã§ã¯ãªããåãªããäžç¹å®ã®å€ãã§ãã
@admilazzãããšæŽæ°ãªãŒããŒãããŒã«ã¯å€§ããªéãããããŸããæŽæ°ãªãŒããŒãããŒã¯æãŸãããããŸããããæ確ã«å®çŸ©ãããŠããŸãã æµ®åå°æ°ç¹ãã£ã¹ãã¯æªå®çŸ©ã®åäœã§ãã
ããªããæ±ããŠããã®ã¯ããªãªãŒã¹ã¢ãŒãã§Vec
å¢çãã§ãã¯ããªãã«ããã®ãšäŒŒãŠããŸãããããã¯æªå®çŸ©ã®åäœãå¯èœã«ããã®ã§ééã£ãŠããŸãã
å®å šãªã³ãŒãã§æªå®çŸ©ã®åäœãèš±å¯ããããšã¯ããªãªãŒã¹ã¢ãŒãã§ã®ã¿çºçããå Žåã§ããåãå ¥ããããŸããã ãããã£ãŠãä¿®æ£ã¯ãªãªãŒã¹ã¢ãŒããšãããã°ã¢ãŒãã®äž¡æ¹ã«é©çšããå¿ èŠããããŸãã
ãã¡ããããããã°ã¢ãŒãã§ããå¶éçãªä¿®æ£ãè¡ãããšã¯å¯èœã§ããããªãªãŒã¹ã¢ãŒãã®ä¿®æ£ã¯æ確ã«å®çŸ©ããå¿ èŠããããŸãã
@admilazzãããšæŽæ°ãªãŒããŒãããŒã«ã¯å€§ããªéãããããŸããæŽæ°ãªãŒããŒãããŒã¯æãŸãããããŸããããæ確ã«å®çŸ©ãããŠããŸãã æµ®åå°æ°ç¹ãã£ã¹ãã¯æªå®çŸ©ã®åäœã§ãã
ãã¡ããã§ããããã®ã¹ã¬ããã¯åäœã®å®çŸ©ã«é¢ãããã®ã§ãã Amanieuãäžèšã§åèã«åç §ããCïŒä»æ§ã®ããã«ããå®å ã¿ã€ãã®äžç¹å®ã®å€ããçæãããã®ãšããŠå®çŸ©ãããŠããå ŽåãïŒå±éºãªæ¹æ³ã§ïŒæªå®çŸ©ã§ã¯ãªããªããŸãã ãããã°ãã«ãã§ã¯ãããã¯ãçºçãããããå®éã®ããã°ã©ã ã§æŽæ°ãªãŒããŒãããŒã®æ確ã«å®çŸ©ãããæ§è³ªãç°¡åã«å©çšããããšã¯ã§ããŸããã åæ§ã«ããªãªãŒã¹ãã«ãã§ç¡å¹ãªãã£ã¹ãã«ãã£ãŠçæãããå€ã¯ããããã°ãã«ãã§ãããã¯ã«ãªã£ãå Žåãããã°ã©ã ãå®éã«ãããå©çšã§ããªãã£ããããäºæž¬å¯èœãŸãã¯ç¹ã«æçšã§ããå¿ èŠã¯ãããŸããã ããã«ãããå®éã«ã¯æé©åã®ç¯å²ãã³ã³ãã€ã©ã«æ倧ã«ãªããŸããã飜åãªã©ã®åäœãéžæãããšã³ã³ãã€ã©ãå¶çŽããããã€ãã£ãã®é£œåå€æåœä»€ããªãããŒããŠã§ã¢ã§ã¯å€§å¹ ã«é ããªãå¯èœæ§ããããŸãã ïŒãããŠã圩床ãæããã«æ£ããããã§ã¯ãããŸãããïŒ
ããªããæ±ããŠããã®ã¯ããªãªãŒã¹ã¢ãŒãã§Vecå¢çãã§ãã¯ããªãã«ããã®ãšäŒŒãŠããŸãããããã¯æªå®çŸ©ã®åäœãå¯èœã«ããã®ã§ééã£ãŠããŸãã å®å šãªã³ãŒãã§æªå®çŸ©ã®åäœãèš±å¯ããããšã¯åãå ¥ããããŸãã...
ãã¹ãŠã®æªå®çŸ©ã®åäœã䌌ãŠããããã§ã¯ãããŸããã æªå®çŸ©ã®åäœã¯ãäœãèµ·ãããã決å®ããã®ã¯ã³ã³ãã€ã©ã®å®è£ è 次第ã§ããããšãæå³ããŸãã ãããŒããintã«ãã£ã¹ãããããšã«ãã£ãŠéã®å®å šä¿èšŒã«éåããæ¹æ³ããªãéããããã¯äººã ãä»»æã®ã¡ã¢ãªäœçœ®ã«æžã蟌ãããšãèš±å¯ããããšã«äŒŒãŠãããšã¯æããŸããã ããã§ãããã¡ãããå¿ ãããäºæž¬å¯èœã§ãªããŠããå®å šãä¿èšŒããããšããæå³ã§å®çŸ©ãããã¹ãã§ããããšã«åæããŸãã
æ¬åœã«ïŒ å°ãªããšãCãšC ++ã§ã¯ãRustãšåãæªå®çŸ©ã®åäœããããŸã... CïŒã«ã€ããŠããããã§ããïŒ
ãã£ããã ã ç§ã¯åœŒãã®ãã¹ãŠã®ä»æ§ãèªãã ããã§ã¯ãããŸããã ããŸããŸãªã³ã³ãã€ã©ããã¹ãããŸããã ãç§ãè©Šãããã¹ãŠã®ã³ã³ãã€ã©ãŒããã®ããã«å®è¡ããããšèšãããšã¯ããèšèªä»æ§ã§ãã®ããã«å®çŸ©ãããŠããããšèšãããšãšã¯ç°ãªããŸãã ããããç§ã¯ãšã«ãããªãŒããŒãããŒãæ¯æããããšã䞻匵ããŠããã®ã§ã¯ãªãããããæãäžè¬çã§ããããã«æãããããšãææããã ãã§ãã 1ïŒæŽæ°ãªãŒããŒãããŒããä¿è·ããã®ãšåãçç±ã§ã1000000.0ã65535ãŸãã¯16960ã«ãªããªã©ã®ãééã£ããçµæããä¿è·ããå€æã䜿çšããããšã«è³æã§ããããã¯ãã°ã§ããå¯èœæ§ãé«ãããããŠãŒã¶ãŒã¯ãªããã€ã³ããå¿ èŠããããŸãã ãããã³2ïŒãªãªãŒã¹ãã«ãã§æ倧ã®ããã©ãŒãã³ã¹ãå®çŸããŸãã
ãã¹ãŠã®æªå®çŸ©ã®åäœã䌌ãŠããããã§ã¯ãããŸããã æªå®çŸ©ã®åäœã¯ãäœãèµ·ãããã決å®ããã®ã¯ã³ã³ãã€ã©ã®å®è£ è 次第ã§ããããšãæå³ããŸãã ãããŒããintã«ãã£ã¹ãããããšã«ãã£ãŠéã®å®å šä¿èšŒã«éåããæ¹æ³ããªãéããããã¯äººã ãä»»æã®ã¡ã¢ãªäœçœ®ã«æžã蟌ãããšãèš±å¯ããããšã«äŒŒãŠãããšã¯æããŸããã ããã«ããããããããã¡ããç§ã¯ãããå®çŸ©ãããã¹ãã§ããããšã«åæããŸãïŒå®çŸ©ãããŸãããå¿ ãããäºæž¬å¯èœã§ã¯ãããŸããã
æªå®çŸ©ã®åäœãšã¯ããªããã£ãã€ã¶ãŒïŒCããã³C ++ã«çŠç¹ãåœãŠãLLVMéçºè ã«ãã£ãŠæäŸãããïŒããããã決ããŠèµ·ãããªããšèªç±ã«æ³å®ããæªå®çŸ©ã®ãã£ã¹ããééããããšã«ãã£ãŠã®ã¿å°éå¯èœãªã³ãŒãã®ãã£ã³ã¯ãåé€ãããªã©ããã®æ³å®ã«åºã¥ããŠã³ãŒããå€æããããšãæå³ããŸããŸãã¯ããšããŠãã®äŸã瀺ãããã«ãå²ãåœãŠãæåã«åŒã³åºããã«åŒã³åºãããã³ãŒããåŒã³åºãã®ã§ãããã¯æªå®çŸ©ã®åäœã«ãªããããã¯å®éã«ã¯ãªãã£ãã«ããããããããšåŒã°ããŠããªããã°ãªããªããšä»®å®ã
ããŸããŸãªæé©åãã¹ãäœæããŠãå±éºãªç·æ¥åäœãçºçããªãããšã蚌æããã®ãåççã§
æªå®çŸ©ã®æ¯ãèãã¯ãã¹ãŠãããã«åºã¥ããŠäŒŒãŠãããšç§ã¯äž»åŒµããŸãã
ããŸããŸãªæé©åãã¹ãäœæããŠãå±éºãªç·æ¥åäœãçºçããªãããšã蚌æããã®ãåççã§ãã£ããšããŠããLLVMéçºè ã¯ãããç¶æããããã®æèçãªåªåãããŸããã
LLVMããã®ããã«éã®èšèšã«åœ±é¿ãäžããã®ã¯æ®å¿µã§ãããLLVMåœä»€ãªãã¡ã¬ã³ã¹ã®äžéšãèªãã ã ãã§ãäžèšã®ãããªãŒãºãæäœã«ã€ããŠèšåããŠããŸãïŒã...ãã1ã€ã¯ãLLVMãããªãŒãºãè¿œå ããã®ãåŸ ã€ããšã§ãã³ã³ã»ãã⊠"ïŒããã¯ãLLVMã¬ãã«ã§ã®æªå®çŸ©ã®åäœãé²ããŸãã éã¯å€ãããŒãžã§ã³ã®LLVMã«çµã³ã€ããŠããŸããïŒ ããã§ãªãå Žåã¯ãããã䜿çšã§ããŸãã ãã ãã圌ãã®ããã¥ã¡ã³ãã¯æ£ç¢ºãªåäœã«ã€ããŠã¯æ確ã§ã¯ãããŸããã
åŒæ°ãundefãŸãã¯poisonã®å Žåããfreezeãã¯ä»»æã§ããåºå®ãããã¿ã€ããtyãã®å€ãè¿ããŸãã ãã以å€ã®å Žåããã®åœä»€ã¯ããŒãªãã¬ãŒã·ã§ã³ã§ãããå ¥ååŒæ°ãè¿ããŸãã åããfreezeãåœä»€ã«ãã£ãŠè¿ãããå€ã®ãã¹ãŠã®äœ¿çšã¯ãåžžã«åãå€ãç£èŠããããšãä¿èšŒãããŠããŸãããç°ãªããfreezeãåœä»€ã¯ç°ãªãå€ãçæããå¯èœæ§ããããŸãã
ãåºå®å€ããŸãã¯ãåããããªãŒãºãåœä»€ããäœãæå³ããã®ãããããŸããã çæ³çã«ã¯ãno-opã«ã³ã³ãã€ã«ãããäºæž¬ã§ããªãæŽæ°ãè¿ããããšæããŸãããããããäœãé«äŸ¡ãªããšãããå¯èœæ§ãããããã§ãã 誰ãããã®ããªãŒãºæäœãè©ŠããŸãããïŒ
ããŠãLLVMããã®ããã«éã®èšèšã«åœ±é¿ãäžããã®ã¯æ®å¿µã§ã
LLVMéçºè ããªããã£ãã€ã¶ãŒãäœæããã ãã§ã¯ãããŸããã ããã¯ãããšãrustcéçºè ããªããã£ãã€ã¶ãŒãæžãããšããŠãããªããã£ãã€ã¶ãŒãé£éããããšããæ°ããªç¹æ§ã®ããã«ãäžæ確ã§ãã¡ãã€ãããšã¯æ¬è³ªçã«å·šå€§ãªãããã¬ã³ã§ãããšããããšã§ãã åé¡ã®äžžããæé©åãã¹ã®é£éã«ãã£ãŠæ§ç¯ãããç·æ¥ã®åäœã§ããå Žåã人éã®è³ã¯åã«ãäžžã誀差ã®æœåšçãªå€§ãããçŽæçã«ç解ãããããã«ã¯é²åããŸããã§ããã
ç§ã¯ããã§ããªãã«å察ããã€ããã¯ãããŸããã :-)ãã®LLVMã®ãããªãŒãºãåœä»€ãããã®æªå®çŸ©ã®åäœãåé¿ããããã®ãŒãã³ã¹ãã®æ¹æ³ãæäŸããããšãé¡ã£ãŠããŸãã
ããã¯äžã§è°è«ãããçµè«ã¯ããã£ã¹ãããŠããããªãŒãºããããšã¯å®çŸ©ãããæ¯ãèãã§ãããããã¯ãŸã£ããåççãªæ¯ãèãã§ã¯ãªããšããããšã§ããã ãªãªãŒã¹ã¢ãŒãã§ã¯ããã®ãããªãã£ã¹ãã¯ãïŒå®å
šã«å®å
šãªã³ãŒãã§ïŒç¯å²å€ã®å
¥åã«å¯ŸããŠä»»æã®çµæãè¿ããŸãã ããã¯ã as
ããã«ç¡éªæ°ã«èŠãããã®ã«ã¯é©ããã»ãã³ãã£ã¯ã¹ã§ã¯ãããŸããã
IMOã®ãããªã»ãã³ãã£ã¯ã¹ã¯ãç§ãã¡ããããé¿ãããæªãèšèªèšèšã«ãªããŸãã
ç§ã®ç«å Žã§ã¯ã
as
ã¯ãå ¥åãšåºåã®ã¿ã€ãã«å¿ããŠã»ãã³ãã£ã¯ã¹ïŒåãæšãŠã飜åãäžžããªã©ïŒã倧ããç°ãªãå¯èœæ§ãããããããã®åé¡ã«é¢ä¿ãªãå®å šã«åé¿ããã®ãæåã§ããã³ãŒããèªãã ïŒåŸè ã§ãfoo as _
ã§æšæž¬ã§ããŸããïŒãããã£ãŠãas
ãä»æ¥ïŒãããŠãããããã以äžïŒè¡ãã±ãŒã¹ãã«ããŒãããæ瀺çã«ååãä»ããããããŸããŸãªå€ææ¹æ³ãææ¡ããããã®ãã©ããpre-RFCããããŸãã ã
ãã®ãã©ãããå®æãããŸããïŒ https://internals.rust-lang.org/t/pre-rfc-add-explicitly-named-numeric-conversion-apis/11395
ãã£ãŒãããã¯ã¯å€§æè¿ã§ãããããã§ã¯ãªãå éšã¹ã¬ããã§ãã£ãŒãããã¯ããŠãã ããã
ãªãªãŒã¹ã¢ãŒãã§ã¯ããã®ãããªãã£ã¹ãã¯ãïŒå®å šã«å®å šãªã³ãŒãã§ïŒç¯å²å€ã®å ¥åã«å¯ŸããŠä»»æã®çµæãè¿ããŸãã ããã¯ãèŠãç®ãç¡éªæ°ãªãã®ã«ãšã£ãŠã¯è¯ãã»ãã³ãã£ã¯ã¹ã§ã¯ãããŸããã
ç¹°ãè¿ããŠç³ãèš³ãããŸãããããããšåãè°è«ãæŽæ°ãªãŒããŒãããŒã«ãåœãŠã¯ãŸããšæããŸãã ããã€ãã®æ°å€ãä¹ç®ããŠçµæããªãŒããŒãããŒãããšãå®è¡ããããšããèšç®ãã»ãŒç¢ºå®ã«ç¡å¹ã«ãªãéåžžã«ééã£ãçµæãåŸãããŸããããããã°ãã«ãã§ãããã¯ãçºçããããããã°ãæ€åºãããå¯èœæ§ããããŸãã éåžžã«ééã£ãçµæãããããæ°å€å€æãããŠãŒã¶ãŒã®ã³ãŒãã®ãã°ãè¡šãå¯èœæ§ãéåžžã«é«ãããããããã¯ã«ãªãã¯ãã§ãã ïŒå žåçãªæµ®åå°æ°ç¹ã®äžæ£ç¢ºãã®ã±ãŒã¹ã¯ãã§ã«åŠçãããŠããŸããèšç®ã§65535.3ãçæãããå Žåããããu16ã«å€æããããšã¯ãã§ã«æå¹ã§ããç¯å²å€ã®å€æãååŸããã«ã¯ãéåžžãã³ãŒãã«ãã°ãå¿ èŠã§ãããã°ä¿®æ£ã§ããããã«éç¥ããããïŒ
ç¡å¹ãªå€æã«å¯ŸããŠä»»æã§ãããå®çŸ©ãããçµæãæäŸãããªãªãŒã¹ãã«ãã®æ©èœã«ãããæ倧ã®ããã©ãŒãã³ã¹ãå¯èœã«ãªããŸããããã¯ãæ°å€å€æãšåããããåºæ¬çãªãã®ã«ãšã£ãŠéèŠã§ãããšç§ã¯èããŠããŸãã åžžã«é£œåãããšãããã©ãŒãã³ã¹ã«å€§ããªåœ±é¿ãããããã°ãé ãããäºæããããã«ééããŠæ£ããçµæãåŸãããèšç®ãè¡ãããšã¯ãã£ãã«ãããŸããã
ç¹°ãè¿ããŠç³ãèš³ãããŸãããããããšåãè°è«ãæŽæ°ãªãŒããŒãããŒã«ãåœãŠã¯ãŸããšæããŸãã ããã€ãã®æ°å€ãä¹ç®ããŠçµæããªãŒããŒãããŒãããšãå®è¡ããããšããŠããèšç®ãã»ãŒç¢ºå®ã«ç¡å¹ã«ãªããéåžžã«ééã£ãçµæãåŸãããŸãã
ããããç§ãã¡ã¯ä¹ç®ã«ã€ããŠè©±ããŠããã®ã§ã¯ãªãããã£ã¹ãã«ã€ããŠè©±ããŠããã®ã§ãã ã¯ããåãããšãæŽæ°ãªãŒããŒãããŒã«ãåœãŠã¯ãŸããŸããintããintãžã®ãã£ã¹ãã¯ããªãŒããŒãããŒããŠããããã¯ã«ãªãããšã¯ãããŸããã ããã¯ã as
ã¯ãèšèšäžããããã°ãã«ãã§ããããã¯ã«ãªããªãããã§ãã å®å
šã§ãªãã³ãŒãã®æ£ç¢ºæ§ãšå®å
šæ§ã¯ããããã¯ã«ãªããªãç¹å®ã®æäœã«äŸåããå¯èœæ§ããããããæµ®åå°æ°ç¹ãã£ã¹ãã§ããããéžè±ããããšã¯ãããããé©ãã¹ãããšã§ãããææªã®å Žåã¯å±éºã§ãã
as
ã®èšèšã«æ¬ é¥ããããšäž»åŒµãããå Žåã¯ãé©åãªå€æãåžžã«å¯èœã§ãããšã¯éããªãã¿ã€ãéã§ç¢ºå®ã«å€æã§ãããããã»ãšãã©ã®äººãåæãããšæããŸãã ããããããã¯ãã®ã¹ã¬ããã®ç¯å²å€ã§ããããã¯ã as
ãã£ã¹ãã®æ¢åã®ãã¬ãŒã ã¯ãŒã¯å
ã§floatããintãžã®å€æãä¿®æ£ããããšã«é¢ãããã®ã§ãã ãããã¯ééãã®ãªããã®ã§ãªããã°ãªããããããã°ãã«ãã§ãã£ãŠããããã¯ã«ãªããªãããã«ããå¿
èŠããããŸãã ãããã£ãŠãfloat-to-intãã£ã¹ãã®åççãªïŒ freeze
ïŒéãããã¯ã»ãã³ãã£ã¯ã¹ãææ¡ãããããããã¯ãèš±å¯ããããã®as
åèšèšã«é¢ããæ°ããè°è«ãéå§ããŠã¿ãŠãã ããããã£ã¹ããäžå¯éã§ããå ŽåïŒããã³intããintãžã®ãã£ã¹ããšfloatããintãžã®ãã£ã¹ãã§äžè²«ããŠããããŸãïŒ-ããããåŸè
ã¯ãã®åé¡ã§ã¯ãããã¯ããå€ããŠããã®ã§ãæ°ããã¹ã¬ãããéããŠãã ããïŒRFC以åã®ã¹ã¿ã€ã«ïŒãã®ããã«ã
ã©ã®ããã«ããŠç§ãã¡ã¯å®è£
ããããšã«ãã£ãŠéå§freeze
UBãä¿®æ£ããããã«ãä»ã®æå³ããæã
ã¯éžæããä»»æã®æå³ã¯ãšã®åŸæ¹äºææ§ã«ãªããŸãã®ã§ããã®åŸãç§ãã¡ã¯å®éã«äœããããã®ã»ãã³ãã£ã¯ã¹ã«åæããäžçã§ã¯ãã¹ãŠã®æéãæã€ããšãã§ããŸãfreeze
ã»ãã³ãã£ã¯ã¹ã
freeze
ã»ãã³ãã£ã¯ã¹ã_now_å®è£ ããŠUBãä¿®æ£ããããšããå§ããŠãéžæããã»ãã³ãã£ã¯ã¹ã¯freeze
ãšäžäœäºææ§ããããããäžçäžã§å®éã«å¿ èŠãªã»ãã³ãã£ã¯ã¹ã«ã€ããŠåæããããšãã§ããŸãã
as
ãããã¯ã«ããªãçç±ã¯ä»ã«ãããã€ããããŸãã@RalfJungã«åæãas
ãã£ã¹ãã ãããããã¯ã«ããããšã¯éåžžã«æãŸãããããŸãããã @ admilazzãè¡ã£ããã®ç¹ã¯æããã«æ£ãããšã¯æããŸããã
ïŒå žåçãªæµ®åå°æ°ç¹ã®äžæ£ç¢ºãã®ã±ãŒã¹ã¯ãã§ã«åŠçãããŠããŸããèšç®ã§65535.3ãçæãããå Žåããããu16ã«å€æããããšã¯ãã§ã«æå¹ã§ããç¯å²å€ã®å€æãååŸããã«ã¯ãéåžžãã³ãŒãã«ãã°ãå¿ èŠã§ãããã°ä¿®æ£ã§ããããã«éç¥ããããïŒ
f32-> u16ã®å Žåãäžžã誀差ã ãã§u16ã®ç¯å²ããå€ããã«ã¯ãéåžžã«å€§ããªäžžã誀差ãå¿
èŠã«ãªãå ŽåããããŸãããf32ãã32ãããæŽæ°ãžã®å€æã®å Žåã¯ããã»ã©æçœã§ã¯ãããŸããã i32::MAX
ã¯f32ã§æ£ç¢ºã«è¡šçŸã§ããŸãããæãè¿ãè¡šçŸå¯èœãªæ°ã¯ã i32::MAX
ãã47ãªãã§ãã ãããã£ãŠãæ°åŠçã«æ倧i32::MAX
æ°å€ã«ãªãã¯ãã®èšç®ãããå ŽåããŒããã1 ULP以äžé¢ãããšã©ãŒã¯ãç¯å²å€ã«ãªããŸãã ãŸããäœç²ŸåºŠã®æµ®åå°æ°ç¹æ°ïŒIEEE 754 binary16ããŸãã¯éæšæºã®bfloat16ïŒãæ€èšãããšãããã«æªåããŸãã
æãç®ã«ã€ããŠã¯è©±ããŠããŸãããããã£ã¹ãã«ã€ããŠè©±ããŠããã®ã§ã
æµ®åå°æ°ç¹ããæŽæ°ãžã®å€æã¯ãä¹ç®ãšã»ãŒåãã³ã³ããã¹ãã§äœ¿çšãããŸããæ°å€èšç®ã§ããæŽæ°ãªãŒããŒãããŒã®åäœãšäžŠè¡ããŠåœ¹ç«ã€ãšæããŸãã
ãããŠãã¯ããåãããšãæŽæ°ãªãŒããŒãããŒã«ãåœãŠã¯ãŸããŸããintããintãžã®ãã£ã¹ãã¯ããªãŒããŒãããŒããŠããããã¯ã«ãªãããšã¯ãããŸãã...æµ®åå°æ°ç¹ãã£ã¹ãã§ããããéžè±ããããšã¯ãå®å šã§ãªãã³ãŒãã®æ£ç¢ºæ§ãšå®å šæ§ãšããŠãããããé©ãã¹ãããšã§ãããææªã®å Žåå±éºã§ãããããã¯ã«ãªããªãç¹å®ã®æäœã«äŸåããå¯èœæ§ããããŸãã
ããã§ã®ççŸã¯äžè¬çãªæ £è¡ã«ãã£ãŠæ£åœåãããããã»ã©é©ãããšã§ã¯ãªããšç§ã¯äž»åŒµããŸãã ã·ããããã¹ã¯ãããã³ãã£ã¹ãã䜿çšããŠæŽæ°ãåãæšãŠãŠåãå»ã-ãããåäœã®ANDãšãµã€ãºå€æŽã®åœ¢åŒãšããŠãã£ã¹ããå¹æçã«äœ¿çšãã-ã¯éåžžã«äžè¬çã§ãããã·ã¹ãã ããã°ã©ãã³ã°ã§é·ãæŽå²ããããŸãã ããã¯ç§ãå°ãªããšãé±ã«æ°åè¡ãããšã§ãã ããããéå»30幎以äžã«ããã£ãŠãNaNãInfinityããŸãã¯ç¯å²å€ã®æµ®åå°æ°ç¹å€ãæŽæ°ã«å€æããããšã§åŠ¥åœãªçµæãåŸããããšæåŸ ããŠããããšãæãåºããŸããã ïŒç§ãæãåºãããšãã§ãããã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã¯ãå€ãçæããèšç®ã®ãã°ã§ãããïŒãããã£ãŠãæŽæ°->æŽæ°ãã£ã¹ããšæµ®åå°æ°ç¹->æŽæ°ãã£ã¹ãã®å Žåãåãããã«æ±ãå¿ èŠã¯ãªããšæããŸãã ãšã¯ããããã§ã«ããã€ãã®æ±ºå®ã確å®ããŠããããšã¯ç解ã§ããŸãã
ãé¡ãããŸãâŠfloatããintãžã®ãã£ã¹ãã®ããã®åççãªïŒããªãŒãºãå«ãŸãªãïŒããããã¯ã«ãªããªãã»ãã³ãã£ã¯ã¹ãææ¡ããŠãã ãã
ããŠãç§ã®ææ¡ã¯æ¬¡ã®ãšããã§ãã
as
ãã£ã¹ããããã©ã«ãã§æ倧ã®ããã©ãŒãã³ã¹ãæã€ããã«ããŸããy = freeze(fptosi(x))
ãy
å€æŽããã«ãã®ãŸãŸã«ããŠãåæåãããŠããªãã¡ã¢ãªããªãŒã¯ããå Žåã¯ãæåã«y
ã¯ãªã¢ããããšã§ä¿®æ£ã§ããŸããïŒas
ãããã©ã«ãã§æ¯èŒçé
ãå ŽåïŒããšãã°ã飜åããŠããããïŒãæ倧ã®ããã©ãŒãã³ã¹ãåŸãæ¹æ³ãæäŸããŸãïŒããšãã°ãããªãŒãºã䜿çšããæ¹æ³-å¿
èŠã«å¿ããŠå®å
šã§ã¯ãªã-ïŒã
- ã»ãã³ãã£ã¯ã¹ã«å€§å¹ ãªå€æŽãå ããã°ããŒãã«ã³ã³ãã€ã«ã¹ã€ããã¯äœ¿çšããªãã§ãã ããã ïŒ-Zsaturating-float-castsã¯ã³ãã³ãã©ã€ã³ãã©ã¡ãŒã¿ãŒãªã©ã§ãããšæããŸããïŒ
æ確ã«ããããã«ãç§ã¯èª°ããå察ãããšã¯æããªãã ãã®ãã©ã°ã¯ãã©ã€ãã©ãªãæŽæ°ãããŠããã©ãŒãã³ã¹ã®äœäžãä¿®æ£ããŠãããšãã«ãããã©ãŒãã³ã¹ã®äœäžãããç°¡åã«æž¬å®ããŠåé¿ããããã®çæçãªããŒã«ãšããŠã®ã¿ææ¡ãããŸããã
f32-> u16ã®å Žåãäžžã誀差ã ãã§u16ã®ç¯å²ããå€ããã«ã¯ãéåžžã«å€§ããªäžžã誀差ãå¿ èŠã«ãªãå ŽåããããŸãããf32ãã32ãããæŽæ°ãžã®å€æã®å Žåã¯ããã»ã©æçœã§ã¯ãããŸããã i32 :: MAXã¯f32ã§æ£ç¢ºã«è¡šçŸã§ããŸãããæãè¿ãè¡šçŸå¯èœãªæ°ã¯ãi32 :: MAXãã47ãªãã§ãã ãããã£ãŠãæ°åŠçã«i32 :: MAXãŸã§ã®æ°å€ã«ãªãã¯ãã®èšç®ãããå ŽåããŒããã1ULP以äžé¢ãããšã©ãŒã¯ç¯å²å€ã«ãªããŸãã
ããã¯å°ã話é¡ããå€ããŠããŸããã2 ^ 31-1ãŸã§ã®f32ãæ°åŠçã«çæããããšã«ãªã£ãŠãããã®æ¶ç©ºã®ã¢ã«ãŽãªãºã ããããšããŸãïŒãã ããäžžã誀差ãåå ã§ããå Žåãé€ããŠã2 ^ 31以äžãçæããã¹ãã§ã¯ãããŸããïŒã ãã§ã«æ¬ é¥ãããããã§ãã
ããªãã説æããããšãå®è¡ããå®çšçãªã¢ã«ãŽãªãºã ã¯ãäœããã®åœ¢ã§æŽæ°ã«å¯æ¥ã«çµã³ã€ããŠãããšæããŸãã ããšãã°ãã©ã³ãã ãªi32ãf32ã«å€æããŠå ã«æ»ãå Žåãi32 :: MAX-64ãè¶ ãããšå€±æããå¯èœæ§ããããŸãã ããããããã¯ããªãã®ç²ŸåºŠãã²ã©ãäœäžãããŸãããããŠç§ã¯ããªãããªããã®ãããªããšãããã®ãåãããŸããã i32ã®å šç¯å²ãåºåããã»ãšãã©ãã¹ãŠã®i32-> f32-> i32èšç®ã¯ãæŽæ°æŒç®ã§ããéããããæ£ç¢ºã«è¡šçŸã§ããŸããããã§ãªãå Žåã¯ãf64ããããŸãã
ãšã«ãããç¯å²å€ã®å€æãå®è¡ããã¢ã«ãŽãªãºã ã飜åã«ãã£ãŠä¿®æ£ãããã±ãŒã¹ãèŠã€ããããšã¯å¯èœã ãšç¢ºä¿¡ããŠããŸããããããã¯ãŸãã ãšæããŸã-ãããã«å¯Ÿå¿ããããã«ãã¹ãŠã®å€æãé ãããã¹ãã§ã¯ãªãã»ã©ãŸãã§ãã ãããŠããã®ãããªã¢ã«ãŽãªãºã ã¯ãããããŸã æ¬ é¥ããããä¿®æ£ããå¿ èŠããããšç§ã¯äž»åŒµããŸãã ãŸããã¢ã«ãŽãªãºã ãä¿®æ£ã§ããªãå Žåã¯ãç¯å²å€ã®å¯èœæ§ã®ããå€æã®åã«ãåžžã«å¢çãã§ãã¯ãå®è¡ã§ããŸãïŒãŸãã¯é£œåå€æé¢æ°ãåŒã³åºããŸãïŒã ããããã°ãçµæãå¶éããè²»çšã¯å¿ èŠãªå Žåã«ã®ã¿æ¯æãããŸãã
PSã¿ããªã«æè¬ç¥ãé ãããŸããã
æ確ã«ããããã«ãç§ã¯èª°ããå察ãããšã¯æããªãã ãã®ãã©ã°ã¯ãçæçãªããŒã«ãšããŠã®ã¿ææ¡ãããŸãã...
ç§ã¯äž»ã«ã-Zsaturated-float-castsã-Zunsaturated-float-castsã«çœ®ãæããææ¡ã«ã€ããŠèšåããŠããŸããã 飜åãããã©ã«ãã«ãªã£ããšããŠãã-Zunsaturated-float-castsã®ãããªãã©ã°ã¯äºææ§ã«æªãããã«èŠããŸããããããäžæçãªãã®ã§ãããå Žåã¯ã倧äžå€«ã§ããæ°ã«ããªãã§ãã ããã :-)
ãšã«ãããç§ããã®åé¡ã«ã€ããŠååã«èšã£ãããšã誰ããæãã§ãããšç¢ºä¿¡ããŠããŸã-ç§ãå«ããŠã RustããŒã ã¯äŒçµ±çã«ãããã©ãŒãã³ã¹ãšå®å šæ§ã®éã§äººã ãèªåã§éžæã§ããããã«ãç©äºãè¡ãããã®è€æ°ã®æ¹æ³ãæäŸããããšããŠããããšãç¥ã£ãŠããŸãã ç§ã¯ç§ã®èŠè§£ãå ±æããçãããæçµçã«è¯ã解決çãæãä»ããšä¿¡ããŠããŸãã æ°ãä»ããŠïŒ
-Zunsaturated-float-casts
ã¯äžæçã«ããååšãããããæç¹ã§åé€ããããšæããŸããã å°ãªããšãã -C
ã§ã¯ãªã-Z
ãªãã·ã§ã³ïŒNightlyã§ã®ã¿å©çšå¯èœïŒã§ããããšã瀺åããŠããŸãã
ãã®äŸ¡å€ã«ã€ããŠã¯ã圩床ãšUBã ããéžæè¢ã§ã¯ãããŸããã ãã1ã€ã®å¯èœæ§ã¯ãLLVMãå€æŽããŠãCPUã®ãã€ãã£ããªãŒããŒãããŒåäœã䜿çšããfptosi
ããªã¢ã³ããè¿œå ããããšã§ããã€ãŸãããªãŒããŒãããŒæã®åäœã¯ã¢ãŒããã¯ãã£éã§ç§»æ€ã§ããŸããããç¹å®ã®ã¢ãŒããã¯ãã£ã§æ確ã«å®çŸ©ãããŸãïŒããšãã°ãx86ã§0x80000000ãè¿ãïŒããã€ãºã³ãåæåãããŠããªãã¡ã¢ãªãè¿ãããšã¯ãããŸããã ããã©ã«ãã飜åç¶æ
ã«ãªã£ããšããŠããããããªãã·ã§ã³ãšããŠæã€ãšããã§ãããã çµå±ã®ãšããã飜åãã£ã¹ãã«ã¯ããã©ã«ãã®åäœã§ã¯ãªãã¢ãŒããã¯ãã£ã«åºæã®ãªãŒããŒãããããããŸããããCPUãè¡ãããšãå®è¡ãããã«ã¯ãç¹å®ã®ã³ã³ãã€ã©ã®æé©åã劚ããããå Žåã«ã®ã¿ãªãŒããŒãããããããŸãã ããããããŸããããfloatããintãžã®ãªãŒããŒãããŒãUBãšããŠæ±ãããšã§æå¹ã«ãªãæé©åã¯ãããã§ãããã»ãšãã©ã®ã³ãŒãã«ã¯é©çšã§ããªããšæããŸãã
ãšã¯ããã1ã€ã®åé¡ã¯ããªãŒããŒãããŒæã«ç°ãªãå€ãè¿ãè€æ°ã®float-to-intåœä»€ãã¢ãŒããã¯ãã£ã«ããå Žåã§ãã ãã®å Žåãã³ã³ãã€ã©ãã©ã¡ãããéžæãããšã芳å¯å¯èœãªåäœã«åœ±é¿ããŸããããèªäœã¯åé¡ã§ã¯ãããŸããããåäžã®fptosi
ãè€è£œããã2ã€ã®ã³ããŒã®åäœãç°ãªãå Žåã¯1ã«ãªãå¯èœæ§ããããŸãã ãããããã®çš®ã®çžéãå®éã«äººæ°ã®ããã¢ãŒããã¯ãã£ã«ååšãããã©ããã¯ããããŸããã ãŸããåãåé¡ããæµ®åå°æ°ç¹ã®çž®å°ãå«ãä»ã®æµ®åå°æ°ç¹ã®æé©åã«ãåœãŠã¯ãŸããŸã...
const fn
ïŒmiriïŒã¯ãRust 1.26以éã飜åãã£ã¹ãåäœããã§ã«éžæããŠããŸãïŒCTFEãšRTFEã®çµæãäžè²«ãããããšä»®å®ïŒïŒ1.26ããåã§ã¯ããªãŒããŒãããŒããã³ã³ãã€ã«æãã£ã¹ãã¯0ãè¿ããŸãïŒ
const fn g(a: f32) -> i32 {
a as i32
}
const Q: i32 = g(1e+12);
fn main() {
println!("{}", Q); // always 2147483647
println!("{}", g(1e+12)); // unspecified value, but always 2147483647 in miri
}
Miri / CTFEã¯ãapfloatã®to_u128
/ to_i128
ã¡ãœããã䜿çšããŠå€æãè¡ããŸãã ãããããããå®å®ããä¿èšŒã§ãããã©ããã¯ããããŸãããç¹ã«ã以åã«å€æŽãããããã«èŠããããšãèãããšïŒMiriã§ãã®ãããªãã®ãå®è£
ãããšãã«æ°ã¥ããŠããŸããã§ããïŒã
ããã¯ãæçµçã«éžæããcodegenã«åãããŠèª¿æŽã§ãããšæããŸãã ããããLLVMã®apfloatïŒRustããŒãžã§ã³ãçŽæ¥ããŒãã§ããïŒã飜åã䜿çšããŠãããšããäºå®ã¯ããããäœããã®ãåççãªããã©ã«ããã§ããããšã瀺ãè¯ãææšã§ãã
芳å¯å¯èœãªåäœã®1ã€ã®è§£æ±ºçã¯ãã³ã³ãã€ã©ãŒã®ãã«ãæã«äœ¿çšå¯èœãªã¡ãœããã®1ã€ããŸãã¯çµæã®ãã€ããªãŒãã©ã³ãã ã«éžæããããšã§ãã
次ã«ãç¹å®ã®åäœãå¿
èŠãšãããŠãŒã¶ãŒåãã«a.saturating_cast::<i32>()
ãããªé¢æ°ãçšæããŸãã
@ dns2utf8
ãã©ã³ãã ã«ããšããèšèã¯ãåçŸå¯èœãªãã«ããååŸããããã®åªåã«åãããã®ã§ãããã³ã³ãã€ã©ããŒãžã§ã³å ã§äºæž¬å¯èœã§ããå Žåã誰ãããããå€æŽããªãããšã«äŸåããããšã決å®ããããšãç¥ã£ãŠããŸãã
@comexã説æããIMOïŒãã®ã¹ã¬ããIIRCã«ãšã£ãŠç®æ°ãããã®ã§ã¯ãªããå€ããã®ã¯ãã¹ãŠæ°ãããã®ã§ãïŒããã¯ã飜åãæãŸãªãå Žåã®æ¬¡åã®ãªãã·ã§ã³ã§ãã ããããã¹ãããããã«LLVMã®å€æŽããå¿ èŠãªãããšã«æ³šæããŠãã ãããã€ã³ã©ã€ã³asmã䜿çšã§ããŸãïŒãã®ãããªåœä»€ãååšããã¢ãŒããã¯ãã£ãŒã§ïŒã
ãšã¯ããã1ã€ã®åé¡ã¯ããªãŒããŒãããŒæã«ç°ãªãå€ãè¿ãè€æ°ã®float-to-intåœä»€ãã¢ãŒããã¯ãã£ã«ããå Žåã§ãã ãã®å Žåãã³ã³ãã€ã©ãã©ã¡ãããéžæãããšã芳å¯å¯èœãªåäœã«åœ±é¿ããŸããããèªäœã¯åé¡ã§ã¯ãããŸããããåäžã®
fptosi
ãè€è£œããã2ã€ã®ã³ããŒã®åäœãç°ãªãå Žåã¯1ã«ãªãå¯èœæ§ããããŸãã
IMOã®ãããªé決å®è«ã¯ã freeze
ãšæ¯èŒããŠã»ãšãã©ãã¹ãŠã®å®çšçãªå©ç¹ãæŸæ£ããŸãã ãããè¡ãå Žåã決å®è«ãšãããã°ã©ã ãæå³ã®ãããšãã«åœä»€ã®åäœã«å®éã«äŸåã§ããããã«ããããã«ãã¢ãŒããã¯ãã£ããšã«1ã€ã®åœä»€ãéžæããŠããã«åºå·ããå¿
èŠããããŸãã äžéšã®ã¢ãŒããã¯ãã£ã§ãããäžå¯èœãªå Žåã¯ããœãããŠã§ã¢ã®å®è£
ã«ãã©ãŒã«ããã¯ããããšãã§ããŸãïŒãã ããããªããèšãããã«ãããã¯å®å
šã«æ¶ç©ºã®ãã®ã§ãïŒã
ããã¯ããã®æ±ºå®ãLLVMã«å§ä»»ããã代ããã«ã€ã³ã©ã€ã³asmã䜿çšããŠæäœãå®è£ ããå Žåã«æãç°¡åã§ãã ã¡ãªã¿ã«ãLLVMãå€æŽããŠæ°ããçµã¿èŸŒã¿é¢æ°ãè¿œå ãããã¹ãŠã®ããã¯ãšã³ãã§ããããäžãããããã¯ããã«ç°¡åã§ãã
@rkruppe
[...]ã¡ãªã¿ã«ãLLVMãå€æŽããŠæ°ããçµã¿èŸŒã¿é¢æ°ãè¿œå ãããã¹ãŠã®ããã¯ãšã³ãã§ããããäžãããããã¯ããã«ç°¡åã§ãã
ããã«ãLLVMã¯ãã¿ãŒã²ããã«äŸåããã»ãã³ãã£ã¯ã¹ãæã€çµã¿èŸŒã¿é¢æ°ã«å®å šã«æºè¶³ããŠããããã§ã¯ãããŸããã
ãã ãããã£ã¹ããé©åã«å®çŸ©ããå Žåã¯ããã£ã¹ãã®åäœãå®çŸ©ããå¿ èŠããããŸãã ãäœãéãããšãããããšããã®ã¯å®éã«ã¯å®çŸ©ã§ã¯ãªããã¿ãŒã²ããã«äŸåããªãæ§é ã«ã¿ãŒã²ããã«äŸåããåäœãäžããã¹ãã ãšã¯æããŸããã
https://groups.google.com/forum/m/#!msg/llvm -dev / cgDFaBmCnDQ / CZAIMj4IBAA
ïŒ10184ãT-langã®ã¿ãšããŠåã¿ã°ä»ãããŸãã解決ãã¹ãåé¡ã«ã¯ã float as int
æå³ã«é¢ããã»ãã³ãã£ãã¯ãªéžæããããšæããŸãã
ïŒã€ãŸãããããã¯ã»ãã³ãã£ã¯ã¹ãèš±å¯ãããã©ããã freeze
ããŒã¹ã®ä»æ§äžè¶³ãèš±å¯ãããã©ãããªã©ïŒ
ãããã¯ãå°ãªããšãæåã®è°è«ã§ããIMOã«ã€ããŠã¯ãTã³ã³ãã€ã©ã§ã¯ãªããT-langããŒã ã察象ãšãã質åã§ãã
ãã®åé¡ãçºçããã ãã§ãåã³ã³ãã€ã«ããªããŠã_å®è¡éã§åçŸã§ããªã_çµæãçæãããŸãã ãã®ãããªå Žåã as
æŒç®åã¯ã¡ã¢ãªããã¬ããŒãžããã§ããããããã§ãã
ãfloatasintãã«as
ã䜿çšããããšãå®å
šã«çŠæ¢ãã代ããã«ç¹å®ã®äžžãæ¹æ³ã«äŸåããããšããå§ãããŸãã çç±ïŒ as
ã¯ãä»ã®ã¿ã€ãã§ã¯æ倱ããããŸããã
çç±ïŒä»ã®ã¿ã€ãã§ã¯æ倱ããªãããã«ã
ããã¯...ã§ããïŒ
Rust Bookã«åºã¥ããŠãç¹å®ã®å ŽåïŒã€ãŸããã¿ã€ãYã«å¯ŸããŠFrom<X>
ãå®çŸ©ãããŠããå ŽåïŒã«ã®ã¿ãã¹ã¬ã¹ã§ãããšæ³å®ããå ŽåããããŸããã€ãŸãã u8
ãu32
ãã£ã¹ãã§ããŸãã From
ã䜿çšããŸããããã®éã¯äœ¿çšããŸããã
ãæ倱ããªãããšã¯ãåãŸãã»ã©å°ããå€ããã£ã¹ãããããšãæå³ããŸãã äŸïŒ 1_u64 as u8
ã¯æ倱ããªãããã u8 as u64 as u8
ã¯æ倱ããããŸããã ãããŒãã®å Žåã 20000000000000000000000000000_u128 as f32
ã¯æ倱ããªãã®ã«å¯Ÿãã 20000001_u32 as f32
ã¯æ倱ããªãããããé©åãã®ç°¡åãªå®çŸ©ã¯ãããŸããããããã£ãŠã float as int
ãint as float
ãæ倱ããããŸããã
ãã ãã 256u64 as u8
ã¯æ倱ããããŸãã
ãããã <anything>_u8 as u64 as u8
ã¯ããã§ã¯ãããŸããã
åªå€±æã¯æ£åžžã§ãããã®ãã¹ã§äºæ³ããããã®ã§ãããåââé¡ã§ã¯ãªããšæããŸãã ãã£ã¹ãã䜿çšããæŽæ°ã®åãæšãŠïŒäŸïŒ u32 as u8
ïŒã¯ãç§ãç¥ã£ãŠãããã¹ãŠã®Cã®ãããªèšèªã§äžè²«ããŠãããããç解ãããŠããæå³ãæã€äžè¬çãªæäœã§ãïŒå°ãªããšãã2ã®è£æ°ã®æŽæ°è¡šçŸã䜿çšããã¢ãŒããã¯ãã£ã§ã¯åºæ¬çã«æè¿ã¯ããããã¹ãŠã§ãïŒã æå¹ãªæµ®åå°æ°ç¹å€æïŒã€ãŸããç©åéšåãå®å
ã«é©åããå ŽåïŒã«ããååã«ç解ãããåæãããã»ãã³ãã£ã¯ã¹ããããŸãã 1.6 as u32
ã¯äžå¯éã§ãããç§ãç¥ã£ãŠãããã¹ãŠã®Cã«äŒŒãèšèªã¯ãçµæã1ã«ãªãã¯ãã§ããããšã«åæããŠããŸãã -ãã£ã¹ãããèšèªã®ããã«ããèªåãäœãããŠããã®ãç¥ã£ãŠãããçš®é¡ã®æŒç®åã§ããé«æ§èœã§ãªããã°ãªããŸããã
ãããã£ãŠãç¡å¹ãªæµ®åå°æ°ç¹å€æãšåãããã«åé¡ããããšèããå¿ èŠã¯ãªããšæããŸããCã®ãããªèšèªãããŒããŠã§ã¢ã§åæãããã»ãã³ãã£ã¯ã¹ããªãããã§ãïŒãã ããéåžžã¯ãšã©ãŒç¶æ ã«ãªããŸãïŒãŸãã¯ããŒããŠã§ã¢ã®äŸå€ïŒãã»ãšãã©ã®å ŽåïŒç§ã®çµéšã§ã¯ïŒãã°ã瀺ããŠãããããéåžžãæ£ããã³ãŒãã«ã¯ååšããŸããã
ãã®åé¡ãçºçããã ãã§ãåã³ã³ãã€ã«ããªããŠãå®è¡éã§åçŸã§ããªãçµæãçæãããŸãã ãã®ãããªå Žåã
as
æŒç®åã¯ã¡ã¢ãªããã¬ããŒãžããã§ããããããã§ãã
å人çã«ã¯ãå€æãç¡å¹ãªå Žåã«ã®ã¿çºçããã¬ããŒãžå€ãçæãã以å€ã«å¯äœçšããªãéããåé¡ãªããšæããŸãã ã³ãŒãã®äžéšã§ç¡å¹ãªå€æãæ¬åœã«å¿ èŠãªå Žåã¯ãå¿ èŠãšæãããã»ãã³ãã£ã¯ã¹ã䜿çšããŠãç¡å¹ãªã±ãŒã¹ãèªåã§åŠçã§ããŸãã
ã¬ããŒãžå€ãçæãã以å€ã«å¯äœçšã¯ãããŸãã
å¯äœçšã¯ãã¬ããŒãžå€ãã¡ã¢ãªã®ã©ããã§çºçããããã€ãã®ïŒããããæ©å¯æ§ã®é«ãïŒããŒã¿ãæããã«ããããšã§ãã floatèªäœããã®ã¿èšç®ããããã©ã³ãã ãå€ãè¿ãããšã¯åé¡ãããŸããããçŸåšã®åäœã¯ããã§ã¯ãããŸããã
æå¹ãªæµ®åå°æ°ç¹å€æïŒã€ãŸããç©åéšåãå®å ã«é©åããå ŽåïŒã«ããååã«ç解ãããåæãããã»ãã³ãã£ã¯ã¹ããããŸãã
æ瀺çãªtrunc()
ã round()
ã floor()
ãŸãã¯ceil()
䌎ããªãfloatããintãžã®å€æã®ãŠãŒã¹ã±ãŒã¹ã¯ãããŸããïŒ as
ã®çŸåšã®äžžãæŠç¥ã¯ãæªå®çŸ©ãã§ããã as
ã¯äžžããããŠããªãæ°å€ã«ã¯ã»ãšãã©äœ¿çšã§ããŸããã ã»ãšãã©ã®å Žåã x as u32
ãæžããŠãã人ã¯ãå®éã«ã¯x.round() as u32
æãã§ãããšæããŸãã
åªå€±æã¯æ£åžžã§ãããã®ãã¹ã§äºæ³ããããã®ã§ãããåââé¡ã§ã¯ãªããšæããŸãã
ç§ã¯åæããŸãããæ倱ãç°¡åã«äºæž¬ã§ããå Žåã«éããŸãã æŽæ°ã®å Žåãäžå¯éå€æã®æ¡ä»¶ã¯æããã§ãã ãããŒãã®å Žåããããã¯ãããŸãã§ãã éåžžã«å€§ããªæ°ã®å Žåã¯æ倱ããããŸããããå°ããæ°ã®å Žåã¯äžžããŠãæ倱ããããŸãã ç§ã®å人çãªå¥œã¿ã¯ã誀ã£ãŠäžå¯éå€æãå°å ¥ããããšãé¿ããããã«ãäžå¯éå€æãšå¯éå€æã®2ã€ã®ç°ãªãæŒç®åã䜿çšããããšã§ãããæ倱ããããã©ãããå€æã§ããå Žåã¯ã1ã€ã®æŒç®åã ãã§ãåé¡ãããŸããã
å¯äœçšã¯ãã¬ããŒãžå€ãã¡ã¢ãªã®ã©ããã§çºçããããã€ãã®ïŒããããæ©å¯æ§ã®é«ãïŒããŒã¿ãæããã«ããããšã§ãã
å®å ãå€æŽããã«ãã®ãŸãŸã«ããŠããããšãæåŸ ããŸããããããæ¬åœã«åé¡ã§ããå Žåã¯ãæåã«ãŒãã«ããããšãã§ããŸãã
æ瀺çãªtruncïŒïŒãroundïŒïŒãfloorïŒïŒããŸãã¯ceilïŒïŒã䌎ããªãfloatããintãžã®å€æã®ãŠãŒã¹ã±ãŒã¹ã¯ãããŸããïŒ
as
ã®çŸåšã®äžžãæŠç¥ã¯ãæªå®çŸ©ãã§ãããäžžããããŠããªãæ°å€ã«ã¯ã»ãšãã©äœ¿çšã§ããŸããã
äžžãæŠç¥ãæ¬åœã«å®çŸ©ãããŠããªãå Žåãããã¯ç§ã«ãšã£ãŠé©ãã§ãããã§ã«æŽæ°ãæå®ããŠããªãéããæŒç®åã¯ã»ãšãã©åœ¹ã«ç«ããªãããšã«åæããŸãã ãŒãã«åãã£ãŠåãæšãŠããããšæããŸãã
ã»ãšãã©ã®å Žåã
x as u32
ãæžããŠãã人ã¯ãå®éã«ã¯x.round() as u32
æãã§ãããšæããŸãã
ãã¡ã€ã³ã«ããããšæããŸããã x.trunc() as u32
ãããªãäžè¬çã«æãŸããŠãããšæããŸãã
ç§ã¯åæããŸãããæ倱ãç°¡åã«äºæž¬ã§ããå Žåã«éããŸãã
ç§ã¯ééããªãåæããŸãã ããšãã°ã 1.6 as u32
ã1ã«ãªãã2ã«ãªããã¯æªå®çŸ©ã§ã¯ãããŸããã
https://doc.rust-lang.org/nightly/reference/expressions/operator-expr.html#type -cast-expressions
ãããŒãããæŽæ°ã«ãã£ã¹ããããšããããŒãã¯ãŒãã«åãã£ãŠäžžããããŸã
泚ïŒçŸåšãäžžããããå€ãã¿ãŒã²ããã®æŽæ°åã§è¡šãããšãã§ããªãå Žåãããã«ããæªå®çŸ©ã®åäœãçºçããŸãã ããã«ã¯ãInfãšNaNãå«ãŸããŸãã ããã¯ãã°ã§ãããä¿®æ£ãããäºå®ã§ãã
ã¡ã¢ã¯ããã«ãªã³ã¯ããŠããŸãã
ãé©åãããå€ã®äžžãã¯æ確ã«å®çŸ©ãããŠããŸãããããã¯ãã®åé¡ã®ç®çã§ã¯ãããŸããã ãã®ã¹ã¬ããã¯ãã§ã«é·ãã®ã§ããã§ã«ç¢ºç«ããææžåãããŠããäºå®ã«ã€ããŠã®æ¥ç·ãæšæž¬ããããšã«ãããåãå ¥ããªãã®ã¯è¯ãããšã§ãã ããããšãã
決å®ããå¿
èŠãããã®ã¯ã次ã®å Žåã«f as $Int
ãå®çŸ©ããæ¹æ³ã§ãã
f.trunc() > $Int::MAX
ïŒæ£ã®ç¡é倧ãå«ãïŒf.trunc() < $Int::MIN
ïŒè² ã®ç¡é倧ãå«ãïŒf.is_nan()
Nightlyã§-Z saturating-casts
ã³ã³ãã€ã©ãã©ã°ã䜿çšããŠãã§ã«å®è£
ããå©çšå¯èœãªãªãã·ã§ã³ã®1ã€ã¯ããããããè¿ãããã«å®çŸ©ããããšã§ãïŒ $Int::MAX
ã $Int::MIN
ãããã³ãŒãã ãã ããä»ã®åäœãéžæããããšã¯å¯èœã§ãã
ç§ã®èŠè§£ã§ã¯ãåäœã¯ééããªã決å®è«çã§ãããïŒããšãã°ãããã¯ã§ã¯ãªãïŒæŽæ°å€ãè¿ãå¿ èŠããããŸãããæ£ç¢ºãªå€ã¯ããã»ã©éèŠã§ã¯ãªãããããã®ã±ãŒã¹ãæ°ã«ãããŠãŒã¶ãŒã¯ãç§ãåå¥ã«ææ¡ããŠããå€ææ¹æ³ã䜿çšããå¿ èŠããããŸãè¿œå ïŒ https ïŒ
ãã¡ã€ã³ã«ããããšæããŸããã
x.trunc() as u32
ãããªãäžè¬çã«æãŸããŠãããšæããŸãã
æ£ããã äžè¬ã«ã x.anything() as u32
ãããããround()
ã§ããã trunc()
ã floor()
ã ceil()
ãŸãã å
·äœçãªäžžãæé ãæå®ããã«x as u32
ã ãã§ãééãã§ããå¯èœæ§ãé«ããªããŸãã
ç§ã®èŠè§£ã§ã¯ãåäœã¯ç¢ºå®ã«æ±ºå®è«çã§ãããïŒããšãã°ãããã¯ã§ã¯ãªãïŒæŽæ°å€ãè¿ãå¿ èŠããããŸãããæ£ç¢ºãªå€ã¯ããã»ã©éèŠã§ã¯ãããŸãã
ãæªå®çŸ©ãã®å€ã§ãããããŒãèªäœã«äŸåãããæãéèŠãªããšãšããŠãç¡é¢ä¿ãªã¬ãžã¹ã¿ãšã¡ã¢ãªã®å 容ãå ¬éããªãéããå人çã«ã¯åé¡ãããŸããã
Nightlyã§
-Z saturating-casts
ã³ã³ãã€ã©ãã©ã°ã䜿çšããŠãã§ã«å®è£ ããå©çšå¯èœãªãªãã·ã§ã³ã®1ã€ã¯ããããããè¿ãããã«å®çŸ©ããããšã§ãïŒ$Int::MAX
ã$Int::MIN
ãããã³ãŒãã ãã ããä»ã®åäœãéžæããããšã¯å¯èœã§ãã
f.trunc() > $Int::MAX
ãšf.trunc() < $Int::MIN
ã§æåŸ
ãããåäœã¯ãæµ®åå°æ°ç¹æ°ã®èæ°ãç¡éãµã€ãºã®æŽæ°ã«å€æããããã®æäžäœããããè¿ãããå Žåãšåãã§ãïŒæŽæ°åã®å€æã®ããã«ïŒã æè¡çã«ã¯ãããã¯ææ°ã«å¿ããŠå·Šã«ã·ãããããææã®ãããã«ãªããŸãïŒæ£ã®æ°ã®å Žåãè² ã®æ°ã¯2ã®è£æ°ã«åŸã£ãŠå転ããå¿
èŠããããŸãïŒã
ãããã£ãŠãããšãã°ãéåžžã«å€§ããªæ°ã0
ã«å€æãããããšãæåŸ
ããŸãã
ç¡é倧ãšNaNãäœã«å€æãããããå®çŸ©ããã®ã¯é£ãã/ããæ£æçã§ããããã«æãããŸãã
WebAssemblyã¯ã次ã®ã»ãã³ãã£ã¯ã¹ã§é£œåãã£ã¹ããå®å®ãããŸããã
@CryZeã ãããç§ããããæ£ããèªãã ããããã¯-Z saturating-casts
ïŒãããŠMiriããã§ã«å®è£
ããŠãããã®ïŒãšäžèŽããŸããïŒ
@RalfJungãã®éãã§ãã
çŽ æŽãããã§ããhttpsïŒ//github.com/WebAssembly/testsuite/blob/master/conversions.wast ïŒãã©ãããæå®ãããçµæã«çœ®ãæããŠïŒãMiriã®ãã¹ãã¹ã€ãŒãã«ã³ããŒã
@RalfJungææ°ããŒãžã§ã³ã®conversions.wastã«æŽæ°ããŠãã ãããããã¯ãæ°ãã飜åå€ææŒç®åã®ãã¹ããå«ãããã«æŽæ°ãããã°ããã§ãã æ°ããæŒç®åã®ååã«ã¯ã_satããå«ãŸããŠããããã©ããããªããããäœã眮ãæããå¿ èŠã¯ãããŸããã
@sunfishcodeæŽæ°ããŠãããŠããããšãïŒ ãšã«ãããã¹ããRustã«å€æããå¿ èŠãããã®ã§ããŸã å€ãã®ãã®ã眮ãæããå¿ èŠããããŸãã ;ïŒ
_sat
ãã¹ãã¯ããã¹ããããå€ã«é¢ããŠäœãéãããããŸããïŒ ïŒç·šéïŒå€ãåãã§ãããšããã³ã¡ã³ãããããŸããïŒRustã®é£œåãã£ã¹ãã«ã€ããŠã¯ããããã®å€ã®å€ããååŸããŠhttps://github.com/rust-lang/miri/pull/1321ã«è¿œå ããŸãã
UBçµã¿èŸŒã¿ã®å ŽåãwasmåŽã®ãã©ããã¯ãMiriã§ã®ã³ã³ãã€ã«å€±æãã¹ãã«ãªãã¯ãã§ãã
å
¥åå€ã¯ãã¹ãŠåãã§ãããå¯äžã®éãã¯ã _sat
æŒç®åãããã©ããæŒç®åããã©ãããäºæããŠããå
¥åã§åºåå€ãæåŸ
ããŠããããšã§ãã
MiriïŒãããã£ãŠRust CTFEãšã³ãžã³ïŒã®ãã¹ããhttps://github.com/rust-lang/miri/pull/1321ã«è¿œå ãããŸããrustc -Zmir-opt-level=0 -Zsaturating-float-casts
ããã®ãã¡ã€ã«ã®ãã¹ãã«åæ ŒããããšãããŒã«ã«ã§ç¢ºèªããŸããã
ãŸããMiriã«ãã§ãã¯ãããŠããªãçµã¿èŸŒã¿é¢æ°ãå®è£
ããŸãããhttpsïŒ//github.com/rust-lang/miri/pull/1325ãåç
§ããŠ
https://github.com/rust-lang/rust/pull/71269#issuecomment -615537137ãæçš¿ããŸãã
ãã®ã¹ã¬ããã®é·ããèãããšãã³ã¡ã³ãã®å 容ãèŠéããŠãããšæãããå Žåã¯ãPRã«ã³ã¡ã³ããéããããã€ããŒãªå Žåã¯ãZulipãŸãã¯DiscordïŒsimulacrumïŒã§æ°è»œã«pingããŠãã ããã PRã¹ã¬ããã§ã®äžèŠãªãã€ãºãé¿ããããã«åé¡ãä¿®æ£ããŸãã
èšèªããŒã ã®èª°ããããã«ãã®PRã§FCPææ¡ãéå§ãããããããŒãžãããšãã®åé¡ãèªåçã«è§£æ±ºãããããšãæåŸ ããŠããŸã:)
ãã§ãã¯ãããã³ã³ããŒãžã§ã³ã®èšç»ã¯ãããŸããïŒ fn i32::checked_from(f64) -> Result<i32, DoesntFit>
ãããªãã®ïŒ
i32::checked_from(4.5)
äœãè¿ãããæ€èšããå¿
èŠããããŸãã
æãåèã«ãªãã³ã¡ã³ã
LLVMã§floatãintãã£ã¹ãã«é£œåãããããã®çµã¿èŸŒã¿é¢æ°ãå®è£ ããããã®äœæ¥ãéå§ããŸããïŒ https ïŒ
ãããã©ããã«è¡ãã°ã飜åã»ãã³ãã£ã¯ã¹ãååŸããããã®æ¯èŒçãªãŒããŒãããã®å°ãªãæ¹æ³ãæäŸããŸãã