ì°ëŠ¬ë as
ëí saturating-float-casts ëìì ìì í í ê³íìŽë©° ìŽì ëìì ì²ëŠ¬íë ìì íì§ ìì ëŒìŽëžë¬ëŠ¬ íšì륌 ìì ííìµëë€. ìì í íë¡ìžì€ì ëí ìµì ë
Œìë # 71269륌 ì°žì¡°íììì€.
컎íìŒë¬ìì -Zsaturating-float-casts
íëê·žê° êµ¬íëììµëë€.ìŽ íëê·žë 몚ë floatìì ì ì ìºì€ížë¡ "í¬í"ëìì ìííì¬ ê²œê³ë¥Œ ë²ìŽë ê²œì° ê°ì¥ ê°ê¹ìŽ 겜ê³ë¡ ê³ ì ë©ëë€. ìŽ ë³íì ëí ë²€ì¹ë§í¹ ìì² ìŽ ìŒë§ ì ì ëììµëë€. 결곌ë ë§ì íë¡ì ížìì êžì ì ìŽì§ë§ ìŒë¶ íë¡ì íž ììë ìì ëíë
ëë€.
ë€ì ëšê³ë ìŽë¬í 겜ì°ì ì±ë¥ì 복구íë ë°©ë²ì ììëŽë ê²ì ëë€.
as
ìºì€íž ëì (ìŒë¶ 겜ì°ìë UB)ì ì·šíê³ êŽë š ì í ë±ì ëíŽ unsafe
íšì륌 ì¶ê°íë ê²ì
ëë€.freeze
ê°ë
ì ì¶ê° í ëê¹ì§ êž°ë€ëŠ¬ë ê²ì
ëë€. ìŽë ê°ë¹ì§ ë¹íž íšíŽì ì»ì§ ë§ ì ìŽë UBê° ìëì ì믞í©ëë€.ì ë°ìŽíž (@nikomatsakis ì ê³µ) : ë§ì ë Œì ì ëí ê³íì êž°ìŽë¥Œ ì»ì
ìë 묞ì ë ë€ì곌 ê°ìµëë€.
ê°ìŽ ty2ì ë§ì§ ììŒë©Ž ê²°ê³Œê° ì ìëì§ ììµëë€.
1.04E+17 as u8
ì§ëª
P-highì ëíŽ íì©ëš, # 10183곌 ëìŒí ì¶ë¡
ëë ìŽê²ìŽ ìžìŽ ìì€ìì ìŽì ë²ì 곌 ížíëì§ ìëë€ê³ ìê°íì§ ììµëë€. ì ìì ìŒë¡ ìëíë ìœëì ìëìŽ ì€ì§ëì§ë ììµëë€. ì§ëª .
P-highë¡ ë³ê²œ, # 10183곌 ëìŒí ì¶ë¡
ìŽ ë¬žì ì # 10185륌 íŽê²°íêž° ìíŽ ìŽë»ê² ì ìí©ëê¹? ëììŽ ì ìëëì§ ì¬ë¶ë ìºì€í ëë ì«ìì ëì ê°ì ë°ëŒ ë€ë¥Žêž° ë묞ì ì ìŒí íŽê²°ì± ì ëì ê²ì¬ë¥Œ ìœì íë ê² ê°ìµëë€. ì°ì ì€ë²íë¡ì ëíŽ ê·žë ê²íê³ ì¶ì§ ìë€ë ë° ëìíë ê² ê°ìµëë€. ìºì€íž ì€ë²íë¡ì ëíŽ ìííŽëë©ëê¹?
"ìì í ë³í"ì ìííë LLVMì ëŽì¥ íšì륌 ì¶ê° í ì ììµëë€. @zwarich ë ë€ë¥ž ììŽëìŽê°ìì ì ììµëë€.
AFAIKë íì¬ ì ìŒí ì룚ì ì íê² ë³ ëŽì¥ íšì륌 ì¬ì©íë ê²ì ëë€. ì ìŽë ëŽê° ë¬ŒìŽ ë³ž ì¬ëì ë°ë¥Žë©Ž JavaScriptCore ê°íë ìŒì ëë€.
ì€, ê·žëŒ ì¶©ë¶í ìœìµëë€.
ping @pnkfelix ê° ìë¡ìŽ ì€ë²íë¡ ê²ì¬ í목ìŒë¡ ë®ì¬ ììµëê¹?
ìŽë¬í ìºì€ížë ëë²ê·ž ìŽì€ ì ìŒë¡ rustcì ìíŽ íìžëì§ ììµëë€.
ëë ìŽê²ì ì²ëŠ¬íê²ëìŽ êž°ìì§ë§ 구첎ì ìž íŽê²°ì± ìŽ íìí©ëë€. ëë ê°ìžì ìŒë¡ ë§€ì° ì ì¬í 묞ì ìŽêž° ë묞ì ì€ë²íë¡ ì ì ì°ì 곌 íšê» íìžíŽìŒíë€ê³ ìê°í©ëë€. ëë ì°ëŠ¬ê° 묎ììíëì§ ì ë§ë¡ ì 겜 ì°ì§ ìëë€.
ìŽ ë¬žì ë íì¬ í¹ì ìì ííììì ì¬ì©ë ë ICE륌 ì ë°í©ëë€.
ìŽê²ì ë€ì í¬ëŒ ê²ì묌ì ì
Undefs, ì? Undefsë ì¬ë¯ž ììµëë€. ê·žë€ì ë²ìíë 겜í¥ìŽ ììµëë€. ëª ë¶ì ë êžë§ í ..
#[inline(never)]
pub fn f(ary: &[u8; 5]) -> &[u8] {
let idx = 1e100f64 as usize;
&ary[idx..]
}
fn main() {
println!("{}", f(&[1; 5])[0xdeadbeef]);
}
-O륌 ì¬ì©íì¬ ëŽ ìì€í (ìµì ìŒê°)ìì segfaults.
ìì í ë ¹ì ë©ëªšëŠ¬ ìì ì±ì ìë° í 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 ì ê·Œ ë°©ìì 죌ì ì¥ì ì ë³í êž°ë¥ìŽ ì 첎ì ìŽëŒë ê²ì ëë€. ê·žë¬ë ìŽë ìêž°ì¹ ìì ëììŽ ë°ìí ì ìë€ë ê²ì ì믞í©ëë€. ì ìëì§ ìì ëìì ë°©ì§ í ì ìì§ë§ ìºì€ížê° ì€ì ë¡ ìë¯žê° ìëì§ íìžíì§ ìëë¡ ììŽêž° ìœìµëë€. (ìŽê²ì ë¶ííë ë€ë¥ž ìºì€ížìë íŽë¹ë©ëë€ : worried :).
ë€ë¥ž ì ê·Œ ë°©ìì íì¬ ì°ì ì°ì°ì ì¬ì©ëë ì ê·Œ ë°©ì곌 ìŒì¹í©ëë€. 늎늬ì€ì ê°ëšíê³ íšìšì ìž êµ¬í, ëë²ê·žì ë²ì ê²ì¬ì ìíŽ ížëŠ¬ê±°ëë íšë. ìíê¹ê²ë ë€ë¥ž as
ìºì€ížìë ë¬ëŠ¬ ìŽë¬í ë³íìŽ íìžëìŽ ì¬ì©ììê²ë ëëŒìŽ ìŒìŽ ë ì ììµëë€ (ìë§ë ì¬êž°ì ì°ì ì°ì°ì ëí ë¹ì ê° ëììŽ ë ì ìì). ìŽê²ì ëí ìŒë¶ ìœë륌 ìììí¬ ì ìì§ë§ AFAICTë íì¬ ì ìëì§ ìì ëìì ìì¡Žíë ìœëììë§ ë°ìíŽìŒí©ëë€ (ìŠ, ì ìëì§ ìì ëì "ì ì륌 ë°ííì, ë¹ì°í ìŽë ê²ìŽ ë ìêŽíì§ ììµëë€"륌 íšëìŒë¡ ë첎í©ëë€).
묞ì ë "ì ì륌 ë°ííì, ë¹ì ì ë¶ëª í ìŽë ê²ì ì 겜 ì°ì§ ìëë€"ê° ìëëŒ, ê·žê²ì ììì ê°ìŽ ìë ë¹ê° ì ë§ ê°ìž undef륌 ì ë°íê³ LLVMì undefê° ë°ìíì§ ìëë€ê³ ê°ì í ì ìë€ë ê²ì ëë€. ëì°í ì못ë ìì ì ìííë ìµì í륌 ê°ë¥íê²í©ëë€. 묎ìì ê°ìŽì§ë§ ê²°ì ì ìŒë¡ undefê° ìëëŒë©Ž 걎ì ì± ë¬žì 륌 íŽê²°íêž°ì 충ë¶í ê²ì ëë€. ííí ììë ê°ìŽ ìŽë»ê² ííëëì§ ì ì í íìê° ììµëë€. undef륌 ë§êž° ë§íë©Žë©ëë€.
@ rust-lang / compiler íììì ë Œìëììµëë€. ê°ì¥ ìŒêŽë ì¡°ì¹ë ë€ì곌 ê°ìµëë€.
죌ì 묞ì ë ìµì 2ì ëí 구첎ì ìž ì ììŽ íìíë€ë ê²ì ëë€.
ë¶ë¥ : P- ì€ê°
@nikomatsakis as
ê°) íì¬ ëë²ê·ž ë¹ëìì íšë ìíê°ë©ëê¹? ê·žë ì§ ìì ê²œì° ìŒêŽì±ê³Œ ììž¡ ê°ë¥ì±ì ìíŽ ê·žëë¡ ì ì§íë ê²ìŽ ì¢ìµëë€. (ëë ê·žê²ìŽ ì°ì 곌 ë§ì°¬ê°ì§ë¡ _íŽìŒíë€ê³ ìê°íì§ë§, ê·žê²ì ë³ê°ì 곌거ì ë
Œìì
ëë€.)
ê·žë ì§ ììŒë©Ž íŽë°± ëììŽ íìí©ëë€. ì íší ê°ì ëíŽ ìµìíì (ìŽìì ìŒë¡ë 0) ë°íì ë¹ì©ìŽ ììŽìŒíì§ë§ LLVM undefê° ìë í ì íí ëìì ê·žë€ì§ ì€ìíì§ ììµëë€.
구첎ì ìž ì ì : ì«ìì ì§ì륌 u64
ë¡ ì¶ì¶íê³ ì§ìë¡ ë¹íž ìííž ì«ì륌 ì¶ì¶í©ëë€.
fn f64_as_u64(f: f64) -> u64 {
let (mantissa, exponent, _sign) = f.integer_decode();
mantissa >> ((-exponent) & 63)
}
ì, ë¹ì©ìŽ 0ì ìëì§ë§ ë€ì ìµì í ê°ë¥íë©° ( integer_decode inline
íìíë©Ž ë ì¢ì ê²ì
ëë€) ì ìŽë ê²°ì ì ì
ëë€. float-> int ìºì€ížë¥Œ íì¥íë 믞ëì MIR-passë ìë§ë floatê°ìŽ ë¬Žê±°ìŽ ë³íì ìºì€ížíê³ ê±Žë ëž ì ìëì§ ì¬ë¶ë¥Œ ë¶ì í ì ììµëë€.
LLVMìë ë³í êž°ë¥ì ëí íë«íŒ ëŽì¥ íšìê° ììµëê¹?
ížì§ : @zwarich ë ë§íë€ (ì€ë ì ) :
AFAIKë íì¬ ì ìŒí ì룚ì ì íê² ë³ ëŽì¥ íšì륌 ì¬ì©íë ê²ì ëë€. ì ìŽë ëŽê° ë¬ŒìŽ ë³ž ì¬ëì ë°ë¥Žë©Ž JavaScriptCore ê°íë ìŒì ëë€.
ì ë¹í© íëê°? AFAIK, @glaebhoerl ìŽ ì ííê³ , as
ë ì륎Ʞ / íì¥íŽìŒíë©°, íŒì°ì°ì륌 íìžíì§ _ ììµëë€.
2016 ë 3 ì 5 ìŒ í ììŒ 03:47:55 AM -0800, Gábor Lehelì ë€ì곌 ê°ìŽ ìŒìµëë€.
@nikomatsakis
as
ê°) íì¬ ëë²ê·ž ë¹ëìì íšë ìíê°ë©ëê¹? ê·žë ì§ ìì ê²œì° ìŒêŽì±ê³Œ ììž¡ ê°ë¥ì±ì ìíŽ ê·žëë¡ ì ì§íë ê²ìŽ ì¢ìµëë€. (ëë ê·žê²ìŽ ì°ì 곌 ë§ì°¬ê°ì§ë¡ _íŽìŒíë€ê³ ìê°íì§ë§, ê·žê²ì ë³ê°ì 곌거ì ë Œìì ëë€.)
ì§ì€. ì€ëë ¥ìŽ ììµëë€.
2016 ë 3 ì 9 ìŒ ìììŒ 02:31:05 AM -0800ì Eduard-Mihai Burtescuë ë€ì곌 ê°ìŽ ìŒìµëë€.
LLVMìë ë³í êž°ë¥ì ëí íë«íŒ ëŽì¥ íšìê° ììµëê¹?
ìì :
AFAIKë íì¬ ì ìŒí ì룚ì ì íê² ë³ ëŽì¥ íšì륌 ì¬ì©íë ê²ì ëë€. ì ìŽë ëŽê° ë¬ŒìŽ ë³ž ì¬ëì ë°ë¥Žë©Ž JavaScriptCore ê°íë ìŒì ëë€.
ì ë¹í© íëê°? AFAIK, @glaebhoerl ìŽ ì ííê³ ,
as
ë ì륎Ʞ / íì¥íŽìŒíë©°, íŒì°ì°ì륌 íìžíì§ _ ììµëë€.
ë€, ì ì ì°©ê° í ê² ê°ìì. as
ë "ì íëì§ ìì ì늌"ì
ëë€.
ë ì¢ë ëì ë , ìŒêŽì±ì ì ì§íë ê²ìŽ ê°ì¥ ì¢ìµëë€.
ê·ž ì² íìŒë¡. íê² ë³ ëŽì¥ íšì륌 ì¬ì©íë©Ž ì벜íê²
ê·žëë ì¢ì íŽê²°ì±
?
@nikomatsakis : ëììŽ ìì§ ì ìëì§ ìì ê² ê°ìµëë€. ê·žê²ì êŽí ê³íì ëí ì ë°ìŽížë¥Œ ì€ ì ììµëê¹?
íšì¬ ì ì ì«ìë¡ìŽ 묞ì 륌 ë§ë¬ìµëë€.
let x: f64 = -1.0;
x as u8
ìµì íì ë°ëŒ 0, 16 ë±ì ê²°ê³Œê° ëì€ë©°, 255ë¡ ì ìëꞰ륌 ë°ëìŒë¯ë¡ x as i16 as u8
륌 ìž íìê° ììµëë€.
@gmorenz !0u8
íŽë³Ž ì
šëì?
ë§ìŽ ìëë ìí©ìì ì ë ë€ížìí¬ë¥Œ íµíŽ ì ì¡ ë ë°ìŽí°ì ëí ë³íìì f64륌 [-255, 255] ë²ìë¡ ì»ììµëë€. ëë ê·žê²ìŽ ë©ì§ê² í¬ì¥ëꞰ륌 ë°ë¬ë€ ( <i32> as u8
í¬ì¥íë ê²ê³Œ ëê°ì ë°©ììŒë¡).
ì¬êž°ì "kill undef" http://lists.llvm.org/pipermail/llvm-dev/2016-October/106182.htmlì ëí ìµê·Œ LLVM ì ììŽ ììµëë€. ìŽ ë¬žì .
ê·žë€ì undef륌 í¬ìŽìŠìŒë¡ ë첎íê³ ììŒë©°, ì믞ë ìœê° ë€ëŠ ëë€. 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 ++ë¡ ëìê°ëë€. íì¬ ë²ì륌 ë²ìŽë ê°ìŽ íë°íêž° ë묞ì íŽë¹ ëª ë ¹ìŽë¥Œ ì¬ì©íë©Ž (ë첎ììŽ!) íì¬ ì°ëŠ¬ê° ê°ì§ ê²ë³Žë€ ê°ì ë ì ìì§ë§ íëì ìí€í ì²ììë§ ê°ë¥í©ëë€.
ìì§í ì ë as
ì«ì í ìºì€ížë¥Œ ì¬ì©íì§ ìê³ From
ë° TryFrom
ëë conv crateì ê°ì ê²ì ì¬ì©íŽìŒíë€ê³ ìê°í©ëë€.
ìë§ë ê·žëŽ ìë ìì§ë§ ê·žê²ì ëìê² ì§ê° ìž ê² ê°ìµëë€.
ì¢ìì,ìŽ ëªšë ëí륌 ë€ì ìœììµëë€. ìŽ ìì
ìŽ ë¹í©íŽìë ìëë€ë ëìê° ìë€ê³ ìê°í©ëë€ ( as
ìì ìŒë°ì ìž ìŒêŽì±ì ìíŽ). íëìŽ ìŽë»ê²ëìŽìŒíëì§ì ëí ë ê°ì§ 죌ì 겜ììê° ììµëë€.
첫 ë²ì§ž 겜ì°ì ìŽë€ 결곌 ê°ëìŽìŒ íëì§ì ëí ëª íí ì ë¡ê° ìëì§ íì€íì§ ììµëë€.
ê·žê²ì ìì±í í ê²°ì ë¡ ì 결곌륌 ì ì§íë ê²ìŽ ì ížë©ëë€. ëë ì°ëŠ¬ê° ê²°ì ë¡ ì ëí 겜ê³ë¥Œ ì ì§í ììë 몚ë ê³³ìŽ ì¹ëŠ¬ëŒê³ ëëëë€. ê·žëë ê²°ê³Œê° ëì§ ì ëªšë¥Žê² ìµëë€.
ëë ê·žê²ì ìŽíŽí ì ìê³ ì ì© íŽ ë³ŽìŽêž° ë묞ì ì±ë륌 ì¢ìíì§ë§, u64 as u32
ìŽ ì늬ë ë°©ì곌ë ìŽëì§ ëªšìëë ê² ê°ìµëë€. ê·žëì ìë§ë ì늌ì êž°ë°ìŒë¡ í ìŽë€ ì¢
ë¥ì ê²°ê³Œê° ìë¯žê° ìì ê² ì
ëë€.
ëŽ ìœëë 0..2 ^ 64 ë²ìì í목ì ëíŽ ì¬ë°ë¥ž ê°ì ì ê³µíê³ ë€ë¥ž 몚ë í목ì ëíŽìë ê²°ì ì ìŽì§ë§ ê°ì§ ê°ì ì ê³µí©ëë€.
ë¶ë ììì ì ê°ì ââ^ ì§ìë¡ íìë©ëë€. ì륌 ë€ìŽ 1.0
ë (2 << 52) ^ -52
ìŽê³ ë¹íž ìíížì ì§ìë ìŽì§ë²ìì ëìŒíë¯ë¡ ìíížë¥Œ ë°ì í ì ììµëë€ (ë°ëŒì ì§ìì ì€ë¥žìªœì ë¶ì ìííž).
ê²°ì ë¡ ì ê²œì° +1.
ëë ìžê°ìê² ì¢ì ì믞륌 ë ê°ì§ë³Žê³ , 컎íìŒë¬ê° ê³ì°ì ìµì í í ì ìì ë ë²ì ëŽììë ê°ì ëíŽ ë ë¹ ë¥ž ì믞륌 ì ííŽìŒíë€ê³ ìê°í©ëë€. (컎íìŒë¬ê° ê°ìŽ ë²ì ëŽì ììì ìê²ëë©Ž ë ìµì 몚ë ëìŒí 결곌륌 ì ê³µíë¯ë¡ ëê°ìŽ ìµì í í ì ììµëë€.)
IntType::max_value()
/ min_value()
)ìë íë ë ìµì
ì 몚ë ì§ì íêž°ìí ê²ì
ëë€. T
ë 몚ë ëšžì ì ì ì íì
ëë€. Tmin ë° Tmaxë T::min_value()
ë° T::max_value()
ì
ëë€. RTZ (v)ë vì ìíì ê°ì ì·šíê³ ìíì ì ì륌 ì»êž° ìíŽ 0ìŒë¡ ë°ì¬ëŠŒ íšì ì믞í©ëë€.
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 륌 ì§ì í©ëë€. "0ìŒë¡ ë°ì¬ëŠŒ"ìŽ ìë ìì ê°ì ëíŽ "ë°ì¬ëŠŒìì ì§ì"ë¡ ë°ì¬ëŠŒí©ëë€.
@ oli-obkì ì ìì ë²ì ëŽììë ê°ì ëíŽ ê³ì°íë ê²ìŽ ë ë¹ ë¥žì§ ê³ ë €í ê°ì¹ê°ìë ìž ë²ì§ž ë°©ë²ì ëë€.
@ oli-obk ë¶ížìë ì ì ì íì ìŽë»ìµëê¹?
ë€ë¥ž ì ìì íŒí©ì ëì§êž° : Mark u128ì ìì íì§ ìì íë¡ížì ìºì€í íê³ ì¬ëë€ìŽìŽë¥Œ ì²ëŠ¬íë ë°©ë²ì ëª ì ì ìŒë¡ ì ííëë¡í©ëë€. u128ì íì¬ ë§€ì° ëë ëë€.
@Manishearth ë¹ì·í ì믞ì ì ì â ë¶ë ììì â ì ì륌 ìí©ëë€. ë ë€ UB-fulìŽê³ ë ìŽì float â integer륌 ìì íì§ ìê² ë§ë€ ì ììŒë¯ë¡ integer â float륌 ìì íì§ ìê² ë§ëë ê²ë íŒíŽìŒí©ëë€.
float â integer saturatingì ê²œì° AFAICTê° ë 빚ëŒì§ëë€ (결곌ì ìŒë¡ and
, test + jump float ë¹êµ ë° ââì í, 몚ë íë ìì¹ìì 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 _
, u128ì ì ìží 몚ë f32::MAX as _
)f32 -> i8, i16, i32, i64, i128, isize
(몚ë f32::MAX as _
)f64
-> 몚ë ì ì (몚ë f64::MAX as _
)f32::INFINITY as u128
ë UBì
ëë€.
@CryZe
ì€ë²íë¡ì²ëŒ íëíë ê²ìŽ ë§ìŽëì§ ììµëê¹? ë°ëŒì ëë²ê·ž ë¹ëìì ì ìëì§ ìì ëììŒë¡ ìºì€ížë¥Œ ìííë©Ž íšëìŽ ë°ìí©ëë€.
ìŽê²ì ëŽê° ì²ìì ìê°,íì§ë§ ë ê²ì ìêž° ë ê²ì
ëë€ as
(ì°ëŠ¬ë íšê» íìž ì€ë² íë¡ì°íì§ ìë ë³íìŽ íì¬ ë¹í©íì§ as
ì¢ë ëì ë ). ë°ëŒì ê°ì¥ ì ì¬í ê²ì "ì ì ë ìì
ì ìí"íë ê²ì
ëë€.
FWIW, "kill undef"ë ì€ì ë¡ ë©ëªšëŠ¬ì ìì íì§ ìì 묞ì 륌 íŽê²°íë ë°©ë²ì ì ê³µíì§ë§ 결곌ë ë¹ ê²°ì ì ì ëë€. 죌ì êµ¬ì± ìì ì€ íëë ë€ì곌 ê°ìµëë€.
3) ì í륌 ì€ì§íë ì ëª ë ¹ìŽ '% y = freeze % x'륌 ë§ëëë€.
ë . ì ë ¥ìŽ ë ìŽë©Ž ììì ê°ì ë°ííì§ë§ ê³ ì ëìŽ ììµëë€.
ê°. (ì€ëë undefì ê°ì§ë§ ê° ì¬ì©ì ëìŒí ê°ì ì»ìµëë€), ê·žë ì§ ììŒë©Ž
ì ë ¥ ê°ì ë°íí©ëë€.
ì€ëë undefsê° ë©ëªšëŠ¬ ìì ì±ì ìë°íë ë° ì¬ì©ë ììë ìŽì ë ì¬ì© ì¬ìŽ, í¹í ê²œê³ ê²ì¬ì íì í¬ìží° ì°ì ì¬ìŽìì ë§ì ì²ëŒ ê°ì ë³ê²œí ì ìêž° ë묞ì ëë€. rustcìŽ ëªšë ìíí ìºì€íž íì ëê²°ì ì¶ê°íë€ë©Ž, ë¹ì ì ì ì ìì§ë§ ì ìëíë ê°ì ì»ê² ë ê²ì ëë€. ì±ë¥ ìž¡ë©Žìì freezeë Ʞ볞ì ìŒë¡ 묎ë£ì ëë€. ë¬Œë¡ ìºì€ížì íŽë¹íë êž°ê³ ëª ë ¹ì ë³ëíë ê°ìŽ ìë ëšìŒ ê°ì ìì±íêž° ë묞ì ëë€. ìµí°ë§ìŽ ì ê° ìŽë€ ìŽì ë¡ ìºì€íž ëª ë ¹ìŽë¥Œ ë³µì íë ê²ì²ëŒ ë껎ì§ëëŒë ë²ì륌 ë²ìŽë ì ë ¥ì ëí 결곌ë ìŒë°ì ìŒë¡ 죌ìŽì§ ìí€í ì²ìì ê²°ì ì ìŽêž° ë묞ì ê·žë ê²íë ê²ìŽ ìì íŽìŒí©ëë€.
...íì§ë§ ê¶êží ì ìŽ ìë€ë©Ž ìí€í ì² ì ë°ì ê±žì³ ê²°ì ì ìŽì§ë ììµëë€. x86ì 몚ë ì못ë ì ë ¥ì ëíŽ 0x80000000ì ë°íí©ëë€. ARMì ë²ì륌 ë²ìŽë ì ë ¥ì ëíŽ í¬í ìíìŽë©° (ìŽ ìì¬ ìœë륌 ì€ë¥žìªœìŒë¡ ìœë 겜ì°) NaNì ëíŽ 0ì ë°íí©ëë€. ë°ëŒì 목íê° ê²°ì ì ìŽê³ íë«íŒ ë 늜ì ìž ê²°ê³Œ 륌 ìì±íë ê²ìŽëŒë©Ž íë«íŒì fp-to-int ëŽì¥ íšì륌 ì¬ì©íë ê²ë§ìŒë¡ë 충ë¶íì§ ììµëë€. ì ìŽë ARMììë ììžì ëí ìí ë ì§ì€í°ë íìžíŽìŒí©ëë€. ìŽê²ì ê·ž ìì²Žë¡ ìœê°ì ì€ë² í€ë륌 ê°ì§ ì ììŒë©°, intrinsicì ìì§ ì¬ì©íì§ ìì ë묞 겜ì°ì ìë 벡í°í륌 íì€í ë°©ì§í©ëë€. ëë ì ê· ë¹êµ ìì ì ì¬ì©íì¬ ë²ì ëŽ ê°ì ëª ì ì ìŒë¡ í ì€íž í ë€ì ì ê· float-to-int륌 ì¬ì©í ì ììµëë€. ìµí° ë§ìŽì ìì íšì¬ ë ì¢ê² ë€ëŠœëë€âŠ
as
ì íì íì¬ ë¹í©íì§ ììµëë€.
ìŽë€ ìì ìì ì°ëŠ¬ë +
ì íšë (ëë²ê·ž 몚ëìì)ìŒë¡ ë³ê²œíìµëë€. ìŽì ì UBìë ìŒìŽì€ìì as
íšëì 볞ë€ê³ íŽì ëëŒì§ ìì ê²ì
ëë€.
ì°ëŠ¬ê° (ì°ëŠ¬ê°íŽìŒíë) íìžì êŽì¬ìŽ ìë€ë©Ž, ì°ëŠ¬ë as
(ì ìŒí ìµì
ìž ì ì€ ìŒìŽì€ê° ììµëê¹?)륌 ì¬ì©íì§ ìê±°ë ìµìí ì¬ì©íì§ ë§ëŒê³ ì¡°ìžíê³ ì¬ëë€ì ë€ì곌 ê°ì ê²ìŒë¡ ìŽëììŒìŒí©ëë€. TryFrom
ë° TryInto
ëì as
ì (륌) ê·žëë¡ëêž°ë¡ ê²°ì íì ë ëë늎 ê³í ìŽëŒê³ ë§í ê²ì
ëë€. ëë ë
Œìì€ìž ì¬ë¡ ê° ì¶ì ìì as
ê° ìŽë€ ê²ì¬ëíì§ ìëë¡ ìŽë¯ž ì ì ë ì¬ë¡ ì ì§ì ìŒë¡ ë€ë¥Žì§ ìë€ê³ ìê°í©ëë€. ì°šìŽì ì ì€ì ë¡ ìŽë¬í 겜ì°ì ëí 구íìŽ íì¬ ë¶ìì íê³ UBê° ìë€ë ê²ì
ëë€. ë¹ì ìŽ ìì§ í ììë ìžê³ as
ê²ì¬ë¥Œíê³ (ëë¶ë¶ì ì íì ìíŽ, ê·žê²ìíì§ ìêž° ë묞ì), ë¹ì ì ë¹í©íì§ì ìì¡Ž í ììë (ë묞ì ìŽë€ ì¢
ë¥ì, ê·žê²ì ê²), ê·žëŠ¬ê³ ê·žê²ì ìŒì¹íì§, ê·žëŠ¬ê³ ì°ëŠ¬ë ì¬ì í ëìê² ê·žë€ ëªšëì ê°ì¥ ëì ê² ê°ë€ëì§ ììë€.
ê·žëììŽ ìì ìì @jorendorffë Ʞ볞ì ìŒë¡ ëìê² ê°ì¥ ì¢ì ê³í ìž ê²ì²ëŒ 볎ìŽë ê²ì ìŽê±°íë€ê³ ìê°í©ëë€.
as
ìë ê²°ì ë¡ ì ëììŽ ììµëë€.ê·žë ìž ê°ì§ ê°ë¥ì±ì ìŽê±°íìµëë€. ëšì ìì ì ìŽë¬í ê°ë¥ì±ì ì¡°ì¬íê±°ë ì ìŽë ê·žì€ íë 륌 ì¡°ì¬íë ê²ìŽëŒê³ ìê°í©ëë€. ìŠ, ì€ì ë¡ êµ¬ííê³ "ë늌"ëë "ë¹ ëŠ"ì ëí ëëì ì»ìŒììì€.
ê±°êž°ì ì°ë¥Žë €ë ëꞰ륌 ëëŒë ì¬ëìŽ ììµëê¹? ëêµ°ê°ë¥Œ ëìŽ ë€ìŽêž° ìíŽ ìŽê²ì E-help-wanted
ë¡ íê·žíê² ìµëë€. (@ oli-obk?)
ìŽ, ëë í¬ë¡ì€ íë«íŒ ìŒêŽì±ì ëí ëê°ë¥Œ ì¹ë¥Žê³ ì¶ì§ ììµëë€ : / ê·žê²ì ê°ë¹ì§ ìž, ì°ë êž°ê° ëê°ë ê²ì êŽì¬ìŽ ììµëë€ (ê·žë¬ë ëë²ê·ž 죌ì¥ìŽ ë§€ì° ëììŽ ë ê²ì ëë€).
íì¬ Rustì 몚ë ë°ì¬ëŠŒ / ì륎Ʞ íšìë ë§€ì° ë늜ëë€ (ì ííê² êµ¬í ë íšì ížì¶). ë°ëŒì as
ë ë¹ ë¥ž ë¶ë ë°ì¬ëŠŒììí ë§ì§ë§ ìëšì
ëë€.
as
ë² ìŽ cvttss2si
ìŽìžì ê²ì ë§ë€ë €ê³ íë€ë©Ž, ê·ž ìì²Žë¡ ìì ì ìž ëìë ì¶ê°íììì€.
@pornel ìŽê²ì ìŽë¡ ì ìž ì¢ ë¥ì UBê° ìëëŒ ê·žê²ìŽ ubìì 묎ìíë©Ž êŽì°®ì ê²ìŽ ìëëŒ ì€ì ìžê³ì ìí¥ì 믞칩ëë€. ì€ì ìœë ìì ìì # 41799륌 ì¶ì¶íìµëë€.
@ est31 UBë¡ ëšê²š ëë ê²ìŽ ì못ëìë€ë ë° ëìíì§ë§ UBì ëí íŽê²°ì±
ìŒë¡ freeze
ì ì ë ê²ì 볎ììµëë€. ì ì ë ê²°ì ë¡ ì ê°ì ë§ëë AFAIK, ë¹ì ì ëšì§ ìŽë ê²ì ë§í ì ììµëë€. ê·ž íëì êŽì°®ìµëë€.
ë êŽì°®ìê±°ìŒ ê·žëì ì륌 ë€ë©Ž ê²œì° u128::MAX as f32
ê²°ì ë¡ ì ìŒë¡ ìì° 17.5
86ì, ë° 999.0
- 64ì, ë° -555
ARMí©ëë€.
freeze
ë ì ìëê³ ê²°ì ì ìŽë©° ì§ì ëì§ ìì ê°ì ìì±íì§ ììµëë€. ê·ž 결곌ë ì¬ì í "컎íìŒë¬ê° ì¢ìíë 몚ë ë¹íž íšíŽ"ìŽë©° ëìŒí ìì
ì ì¬ì©íë 겜ì°ìë§ ìŒêŽë©ëë€. ìŽê²ì ì¬ëë€ìŽ ììì ìì§ í UB ìì± ìì 륌 ííŒ í ì ìì§ë§ ë€ìì ì ê³µíì§ë ììµëë€.
u128 :: MAX as f32ë ê²°ì ì ìŒë¡ 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
(ìŠ, ë°í ë ì§ì€í°ì ë§ì§ë§ìŒë¡ ì ì¥ë ê²ì ë°íí©ëë€)
ëŽê° ì°žì¡°. ê·žê²ì ì¬ì í ââëŽ ì©ëë¡ íì©ë©ëë€ (ë²ì륌 ë²ìŽë ê°ìŽ ììëë ê²œì° ë¯žëŠ¬ íŽëšíí©ëë€. ë²ì ëŽ ê°ì êž°ëíì§ë§ ê·žë ì§ ìì ê²œì° ìŽë€ 겜ì°ìë ì¬ë°ë¥ž 결곌륌 ì»ì§ 못í ê²ì ëë€) .
ê°ìŽ ê³ ì ëìŽìë í ììì ê°ì ë°ííë ë²ì륌 ë²ìŽë íë¡íž ìºì€ížì 묞ì ê° ììŒë¯ë¡ ë ìŽì ì ìëì§ ìì ëìì ìŒìŒí¬ ì ììµëë€.
LLVMìì freeze
ê°ì ê²ì ì¬ì©í ì ììµëê¹? ëë ê·žê²ìŽ ìì í ìŽë¡ ì ìž êµ¬ì±ìŽëŒê³ ìê°íìµëë€.
@nikomatsakis ëë ê·žê²ìŽ ( poison
ìë ë¬ëŠ¬) ê·žë ê² ì¬ì©ëë ê²ì 볞 ì ìŽ ììµëë€.
freeze
ë ì€ëë LLVMì ì í ì¡Žì¬íì§ ììµëë€. ì ì ë ê²ìŒë¿ì
ëë€ (
ì¬êž°ì ì ì ë ë³ê²œ ì¬íì ëíŽë³Žë€ êŽë²ìí ë
Œì륌 ìíŽ RFC륌 ìŽê³ ì¶ìµëê¹? IMO, as
ì ì±ë¥ì ì ì¬ì ìŒë¡ ìí¥ì 믞ì¹ë 몚ë ê²ì ë
Œìì ì¬ì§ê°ìì ê²ìŽì§ë§, ì¬ëë€ìê² ê·žë€ì 목ì늬륌ë€ì êž°íë¥Œì£Œì§ ìëë€ë©Ž ë ë°°ì ë
ŒììŽ ë ê²ì
ëë€.
ì ë Julia ê°ë°ììŽë©° ëìŒí LLVM ë°±ìë륌 ê³µì íê³ ì ì¬í 묞ì ê° ìêž° ë묞ììŽ ë¬žì 륌 íëì ì§ìŒ ììµëë€. êŽì¬ìŽìë ê²œì° ë€ì곌 ê°ìŽ ê²°ì íìµëë€ (ëŽ ì»Žíší°ì ëšìŒ êž°ë¥ì ëí ëëµì ìž íìŽë° í¬íš).
unsafe_trunc(Int64, x)
ë íŽë¹ LLVM ëŽì¥ fptosi
(1.5ns)ì ì§ì 맀íë©ëë€.trunc(Int64, x)
ë ë²ì륌 ë²ìŽë ê° (3ns)ì ëí ììžë¥Œ ë°ììíµëë€.convert(Int64, x)
ë ë²ì륌 ë²ìŽ ë¬ê±°ë ì ìê° ìë ê° (6ns)ì ëíŽ ììžë¥Œ ë°ììíµëë€.ëí ì ìëì§ ìì ëìì ì¢ ë ì ì íëë¡ ë©ìŒ ë§ëŠ¬ì€íž ì
@bstrie RFCë êŽì°®ì§ ë§ ë°ìŽí°ê° ììŒë©Ž íì€í ì ì©íë€ê³ ìê°í©ëë€! ê·žë¬ë @simonbyrne ì ì견ì ê·ž ì ìì ë§€ì° ì ì©í©ëë€.
ëë JS ìë¯žë¡ ( @jorendorff 몚ëë¡ ìžêž)곌 "í¬í"ìŽë¡ 볎ìŽë ìë° ìë¯žë¡ ì ê°ì§ê³ ëìë€. íŽë¹ ë§í¬ê° ë§ë£ëë ê²œì° 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 ì ì© ì±ëë ì¬êž°ì ìë¯žê° ììµëë€. ë°ëŒì ìŽë ìì ìì 몚ëë¡ë 몚ë 0ì²ëŒ ìžëªšìë ê²ìŽ ë ê²ì ëë€.
IëìŽ íì E-needs-mentor
íê³ ê·žê²ì íê·ž WG-compiler-middle
ê° IMPL êž°ê°ìŽ ì¶ê°ë¡ ì¡°ì¬ í ììë ì¢ì ìê°ìŽ ë ìë 볎ìŽêž° ë묞ì! êž°ë¡ ê³íì ëí ëì êž°ì¡Ž
ë¿¡ ë¹µëš
IIRC LLVMì ê²°êµ freeze
구íí ê³íì
ëë€. ê·žë¬ë©Ž freeze
륌 ìííì¬ UB륌 ì²ëŠ¬ í ì ââììµëë€.
ëŽ ê²°ê³Œ : https://gist.github.com/s3bk/4bdfbe2acca30fcf587006ebb4811744
_array ë³íì 1024 ê° ê°ì 룚í륌 ì€íí©ëë€.
_ ìºì€íž : x as i32
_clip : x.min (MAX) .max (MIN) as i32
_panic : xê° ë²ì륌 ë²ìŽëë©Ž íšë
_zero : ë²ì륌 ë²ìŽë ê²œì° ê²°ê³Œë¥Œ 0ìŒë¡ ì€ì í©ëë€.
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)
ê°ë³ ìì ì ëíŽ ê²°ê³Œë¥Œ ì ìë¡ ë°ì¬ëŠŒ í íìê° ììµëë€. ë¶ëª íìŽ 2ns / iter ë€ìë ìœê°ì ì°šìŽê°ìì ê²ì ëë€. ìëë©Ž 4 ê° ë³í 몚ëì ëíŽ _ ì íí _ 2nsì ê°ìê°ì?
@ sp-1234 ë¶ë¶ì ìŒë¡ ìµì íëìëì§ ê¶êží©ëë€.
@ sp-1234 ìž¡ì íêž° ë묎 ë¹ ëŠ
ëë€. ë¹ ë°°ìŽ ë²€ì¹ ë§í¬ë Ʞ볞ì ìŒë¡ ìžëªšê° ììµëë€.
#[inline(never)]
륌 íµíŽ ëšìŒ ê° íšì륌 íšìë¡ ê°ì íë©Ž 2ns ë 3nsê°ë©ëë€.
ë¿¡ ë¹µëš
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ê° ììëë¯ë¡ ìŽë¬í ì«ì륌 ìì ì ìŒë¡ íŽìíêž°ê° ëì± ìŽë €ìì§ëë€.
죌목í ë§í ë ê°ì§ ì¬í :
cast_clip
구íì @alexcrichton ì í¬í ìºì€ížë³Žë€ ëëŠ¬ê² ëíë©ëë€ (ê·žë€ì ì€í곌 ì ì ì€í ìê°ì as
íìŽë°ìŽ ê±°ì ê°ìµëë€ cast_panic
ê° ë€ë¥ž íìž ë ìºì€ížë³Žë€ ë늜ëë€. ëí ìŽë ìŽ ë²€ì¹ ë§í¬ìì íšì¬ ë ë늰 ìë륌 ëŽ
ëë€. ìë§ë ìŽë¬í ê²ë€ìŽ ë§ìŽí¬ë¡ ìí€í
ì² ìžë¶ ì¬í ë° / ëë ìµì í êž° ë¶ìêž°ì í¬ê² ìì¡Ž í ì ììµëê¹?êž°ë¡ì ìíŽ, ëë ê°ë²ŒìŽ ë¶íì i7-6700Kìì rustc 1.21.0-nightly (d692a91fa 2017-08-04), -C opt-level=3
ë¡ ìž¡ì íìµëë€.
ê²°ë¡ ì ìŒë¡ ì§êžê¹ì§ë ì 뢰í ììë ë°ìŽí°ê°ìê³ ë ì 뢰í ììë ë°ìŽí°ë¥Œ ì»ë ê²ìŽ ìŽë µë€ê³ ê²°ë¡ ì§ììµëë€. ëí ì€ì ìì© íë¡ê·žëšìŽìŽ ìì
ì 벜ìê³ ìê°ì 1 %ë ìë¹íì§ ìëë€ë ê²ì ìì¬ ì€ëœìµëë€. ë°ëŒì ì ë rustc ìì -Z
íëê·ž ë€ì as
ìºì€ížë¥Œ í¬í ìí ë¡ -Z
ìì© íë¡ê·žëš.
ížì§ : ê°ë¥íë€ë©Ž ë€ìí ìí€í ì² (ì : ARM í¬íš) ë° ë§ìŽí¬ë¡ ìí€í ì²ìì ìŽë¬í ë²€ì¹ ë§í¬ë¥Œ ì€ííë ê²ìŽ ì¢ìµëë€.
ëë ë
¹ì ìµìíì§ ìë€ë ê²ì ìžì íì§ë§ ìŽ ì€ ì 믞ë¬íê² íë žë€ê³ ìê° std::i32::MAX
(2 ^ 31-1)ì Float32ë¡ ì ííê² ííí ì ììŒë¯ë¡ std::i32::MAX as f32
ë ê°ì¥ ê°ê¹ìŽ íí ê°ë¥í ê° (2 ^ 31)ìŒë¡ ë°ì¬ëŠŒë©ëë€. ìŽ ê°ìŽ x
ìžìë¡ ì¬ì©ëë©Ž 결곌ë êž°ì ì ìŒë¡ ì ìëì§ ììµëë€. ì격í ë¶ë±ììŒë¡ ë첎íë©ŽìŽ ê²œì°ê° íŽê²°ë©ëë€.
ì, ì°ëŠ¬ë ìŽì ì Servoìì ì íí ê·ž 묞ì ê°ìììµëë€. ìµì¢ íŽê²°ì± ì f64ë¡ ìºì€í í ë€ì íŽëšííë ê²ìŽ ììµëë€.
ë€ë¥ž ì룚ì ìŽ ìì§ë§ ꜀ ê¹ë€ ë¡ê³ rustë ìŽê²ì ì ì²ëŠ¬íêž°ìí ì¢ì 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-4570 CPU ë° Rust 1.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ìŽ ê²°êµ ëë¶ë¶ì ìœë륌 ëšìŒ ëª
ë ¹ìŽë¡ ì ëë¡ ê°ë¥Ž ì¹ ì ììê¹ì?
@ActuallyaDeviloper asm ë° ë²€ì¹ ë§í¬ ê²°ê³Œê° ë§€ì° ì¢ì 볎ì
ëë€! ëí, ê·íì ê°ì ë¶êž°ìë ìœëë ë€ë¥ž ì룚ì
ì ì€ì²© 조걎ë¶ë³Žë€ rustc
ìì ìì±íêž°ê° ë ì¬ìž ê²ì
ëë€ (ë ìœë륌 ìíŽ lang í목 íšì륌 ížì¶íë ëì ìžëŒìž IRì ìì±íë€ê³ ê°ì í©ëë€). ìŽ êžì ìš ì£Œì
ì ê°ì¬í©ëë€.
u16_cast_clip2
ì ëí ì§ë¬žìŽ ììµëë€ : NaNì ì²ëŠ¬íì§ ìë ê² ê°ìµëë€?! NaNì ëí ìê²¬ìŽ ìì§ë§ íšìê° NaNì ìì ëì§ ìì ìíë¡ ì ë¬íê³ f32
ë¡ ìºì€ížíë €ê³ ìë í ê²ìŽëŒê³ ìê°í©ëë€ (ê·žë ì§ ìëëŒë 0ìŽ ìë ê²œê³ ê° ì€ íë륌 ìì±í©ëë€. ).
ì¶ì : ëª
ííê² ë§íìë©Ž, ìºì€ížê° 벡í°í ë ì ìëì§ ì¬ë¶ê° ì€ìíì§ ìë€ê³ ììíë €ë ê²ìŽ ìëëë€. ì£Œë³ ìœëê° ë²¡í°í ê°ë¥íì§ ì¬ë¶ë ë¶ëª
í ì€ìí©ëë€. ê·žë¬ë 벡í°íê° ì ì©ëì§ ìë 겜ì°ê° ë§ê³ ì ê° ìžêž í ë²€ì¹ ë§í¬ìì ì€ì¹ŒëŒ ì±ë¥ì ëí ì€ëª
ìíì§ ììêž° ë묞ì ì€ì¹ŒëŒ ì±ë¥ ë ì€ìí©ëë€. í¥ë¯žë¡ê²ë *array*
ë²€ì¹ ë§í¬ì asmì íìžíì¬ êµ¬íì ì¬ì í 벡í°íëìŽ ìëì§ íìž íìµëê¹?
@rkruppe ë§ìµëë€. ì€ìë¡ if
ì ìž¡ë©Žì ë°ê¿ì ììŽ ë²ë žìµëë€. f32 as u16
ì쪜 0x8000ì ìëŒì ì¬ë°ë¥ž ìì
ì ìííêž° ë묞ì í
ì€ížììëìŽë¥Œ í¬ì°©íì§ ëª»íìµëë€. ìŽë²ìë ë¶êž°ë¥Œ ë€ì êµì²Žíê³ ëªšë ë©ìë륌 if (y.is_nan()) { panic!("NaN"); }
í
ì€ížíì¬ ë¬žì 륌 íŽê²°íìµëë€.
ìŽì ê²ì묌ì ì
ë°ìŽížíìµëë€. x86 ìœëë ì í ë³ê²œëì§ ììì§ë§ ë¶ííë ë³ê²œìŒë¡ ìžíŽ LLVMìŽ ìŽë€ ìŽì ë¡ u16
ARM ìŒìŽì€ìì vmax
륌 ìì±íì§ ëª»í©ëë€. ì ë ìŽê²ìŽ íŽë¹ ARM ëª
ë ¹ìŽì NaN ì²ëŠ¬ì ëí ìžë¶ ì 볎ì êŽë šìŽ ìê±°ë LLVM ì í ìŒ ì ìë€ê³ ê°ì í©ëë€.
ìëíë ìŽì 륌 ìíŽ ë¶ížìë ê°ì ê²œì° ííê°ìŽ ì€ì ë¡ 0ìŽëŒë ì ì ì ìíììì€. ë°ëŒì NaN곌 ííì ëìì ì¡ì ì ììµëë€.
ë°°ìŽ ë²ì ì 벡í°íë©ëë€.
Godbolt : https://godbolt.org/g/HnmsSV
Re : the ARM asm , vmax
ìŽ ë ìŽì ì¬ì©ëì§ ìë ìŽì ë íŒì°ì°ìê° NaNìŽë©Ž NaNì ë°ííêž° ë묞 ìŽëŒê³ vmovgt
, ìŽì vcmp
륌 0ìŒë¡ ì°žì¡°)ì ì¬ì©í©ëë€.
ìëíë ìŽì 륌 ìíŽ ë¶ížìë ê°ì ê²œì° ííê°ìŽ ì€ì ë¡ 0ìŽëŒë ì ì ì ìíììì€. ë°ëŒì NaN곌 ííì ëìì ì¡ì ì ììµëë€.
ì€, ë§ì. ì¢ì.
-Z íëê·ž ë€ì rustcìì ìºì€ížë¡ í¬í륌 구ííì¬ ììŒë¡ ëìê° ê²ì ì ìí©ëë€.
ëë ìŽê²ì 구ííìŒë©° # 41799륌 ìì íê³ ë ë§ì í ì€ížë¥Œ ë°ìŒë©Ž PRì ì ì¶í ê²ì ëë€.
@rkruppe miriê° ëìŒí ë³ê²œ ì¬íì ì ì©íëë¡ @ oli-obkì íë ¥íŽìŒí©ëë€.
í 늬íì€íž : # 45205
-Z saturating-float-casts
륌 íµíŽ RUSTFLAGS
-Z saturating-float-casts
륌 ì ë¬ íì¬ ì±ëì ì±ë¥ ìí¥ì ìž¡ì í ì ììµëë€ (ë€ì ë°€ë¶í° ìì). [1] ìŽë¬í ìž¡ì ììŽ ë¬žì 륌 ì²ëŠ¬íë ë°©ë²ì ê²°ì íë ë° ë§€ì° ì ì©í©ëë€.[1] ìë°í ë§íŽì ìŽê²ì íì€ ëŒìŽëžë¬ëŠ¬ì ìŒë° ëŒìŽëžë¬ëŠ¬ê° ìë #[inline]
ë¶ë¶ì ìí¥ìì£Œì§ ììŒë¯ë¡ 100 % ì ííë €ë©Ž Xargoë¡ ë¡ì»¬ìì íì€ì ë¹ëíë ê²ìŽ ì¢ìµëë€. ê·žë¬ë ìŽë¡ ìžíŽ ìí¥ìë°ë ìœëê° ë§ì ê²ìŽëŒê³ ë ìê°íì§ ììµëë€ (ì륌 ë€ìŽ ë€ìí ë³í í¹ì± implsë #[inline]
ì
ëë€).
@rkruppe https://internals.rust-lang.org/t/help-us-benchmark-incremental-compilation/6153/ 곌 ê°ì 맥ëœìì ëŽë¶ / ì¬ì©ì íìŽì§ë¥Œ ììíì¬ ë°ìŽí°ë¥Œ ìì§ í ê²ì ì ìí©ëë€. ìŽì ížë컀ìì ììì ëêžìŽ ìë ì¬ëë€ì ì¬êž°ì ì°ê²°)
@rkruppe ì¶ì 묞ì 륌 ë§ë€ìŽìŒí©ëë€. ìŽ í ë¡ ì ìŽë¯ž ë ê°ì§ 묞ì ë¡ ëë©ëë€. ê·ž ì¢ì§ ìë€!
@Gankro ë€, ëì í©ëë€ë§, êžì ì¬ë°ë¡ ìž ìê°ì ì°Ÿêž°ê¹ì§ ë©°ì¹ ìŽ
@ est31 í . -Z íëê·žê° ë ìºì€íž ë°©í¥ì 몚ë ë€ë£šì§ ë§ (ëìŽìŒ 볎멎 ì€ì ìì ì ìì) ëìì ë ì€ìì¹ë¥Œ 쌀 ê² ê°ì§ ìì ê² ê°ìµëë€. (ì륌 ë€ìŽ,ìŽ ë¬žì ë ì±ëì ì±ë¥ì ë¬ë € ììŒë©° # 41799ììë ì¬ë°ë¥ž ì룚ì
ìŽ ë¬Žììžì§ì ëíŽ ëìíìµëë€).
ìŽ ë²€ì¹ ë§í¬ë ì£Œë¡ ëí # 41799ì ëí ìì ì ìí¥ì ìž¡ì íë ê²ìŽìŽ 묞ì 륌 ëììŒë¡íë ì¡°êž ë°ë³Žì
ëë€,íì§ë§ ë ì¢
ë¥ì ê·žê²ê³Œ êŽì°®ì íŽì, ê·žëì ì±ë¥ íê·ì overreporting ê°ì¥ ì ëìì ê·ž ìº. (ê·žë¬ë ëêµ°ê°ê° -Z íë귞륌 ëë¡ ë¶í íë €ë ëêž°ê° ìë€ë©Ž ê³ì ì§ííììì€.)
íëê·žê° ì ì©ì±ë³Žë€ ì€ë ì§ìëë©Ž íë귞륌 ì ê±°íë ìì ì ëí ì¶ì 묞ì 륌 ê³ ë €íì§ë§ ì¬êž°ì # 41799ìì ë°ìíë í ë¡ ì ë³í© í íìê° ìë€ê³ ìê°í©ëë€.
ëŽë¶ ê²ì묌ì ìì±íìµëë€ : https://gist.github.com/Gankro/feab9fb0c42881984caf93c7ad494ebd
ìì ë¡ê² ë³µì¬íê±°ë ë©ëªšë¥Œ ëšê²šì ê²ì í ì ììµëë€. ( const fn
ëìì ëíŽ ìœê° íŒë ì€ëœìµëë€)
í ê°ì§ ì¶ê° ì 볎ë float-> int ë³íì ë¹ì©ìŽ êž°ë³žìŽ ìëëŒ íì¬ êµ¬íì ë°ëŒ ë€ë¥Žë€ë ê²ì
ëë€. x86ìì cvtss2si
cvttss2si
ë ë묎 ë®ì, ë묎 ëì ë° nan ê²œì° 0x80000000ì ë°ííë¯ë¡ cvtss2si
cvttss2si
-Zsaturating-float-casts
륌 구íí ì ììµëë€. cvttss2si
ë€ì 0x80000000 ìŒìŽì€ì í¹ì ìœëê° ëì€ë¯ë¡ ìŒë°ì ìž ê²œì° ëšìŒ ë¹êµ ë° ââììž¡ ë¶êž° ìŒ ì ììµëë€. ARMìì vcvt.s32.f32
ìë ìŽë¯ž -Zsaturating-float-casts
ìë¯žê° ììµëë€. LLVMì íì¬ ë ê²œì° ëªšë ì¶ê° ê²ì¬ë¥Œ ìµì ííì§ ììµëë€.
@Gankro
ì ë§ ê°ì¬í©ëë€! ìì ì ëíŽ ëª ê°ì§ ë©ëªšë¥Œ ëšê²Œìµëë€. ìŽê²ì ìœì í, ëë -Z íëê·žìì u128-> f32 ìºì€ížë¥Œ ë¶ëŠ¬íë ë° ì°ë¬ë³Žê³ ì¶ìµëë€. ë ê°ì ì§êµ êž°ë¥ì ë®ë ê¹ë°ì ëí죌ì ì°ë§ íšì ìì êž° ìíŽìì ëë€.
(float-> int 묞ì ë§ ë€ë£šëë¡ -Z íë귞륌 ë€ì ìŽì ì ë§ì¶êž° ìíŽ # 45900ì ì ì¶íìµëë€.)
ëë ë²€ì¹ë§í¹ì ìì²íêž° ì ì @sunfishcode (ì ìŽë x86ì 겜ì°)ë¡ íë«íŒ ë³ êµ¬íì ì»ì ì ìë€ë©Ž ì¢ì ê²ì ëë€. 귞늬 ìŽë µì§ ìì ê²ì ëë€.
묞ì ë ëŽê° ìë í LLVMìŽìŽ ìì ì ìííë ë°©ë²ì ì ê³µíì§ ìëë€ë ê²ì ëë€.
í ë¡ ì ë°ìíêž° ìíŽ ìŽìì ì ë°ìŽížíìµëë€ (Ʞ볞ì ìŒë¡ 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
몚ë ëšìŒ ëª
ë ¹ìŽë¡ 컎íìŒë©ëë€. (ëë²ê·ž 몚ëìì float_to_int_with_intrinsic
ë ëª ê°ì§ ëª
ë ¹ì ëë¹íì¬ 0ì ëìì ëì§ ë§ ëìì§ë ììµëë€.)
ìŒì í íŽë©ì ì¬ë°ë¥Žê² ìííë ê² ê°ìµëë€. ì륌 ë€ë©Ž
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ì í¹ìí ê²œì° ìŒë° 구íì ëí ë°ìŽí°ë¥Œ íšì¬ ì ê² ì»ì ì ììŒë©° ëë¶ë¶ì ë€ë¥ž ëììì ì¬ì í ì¬ì©ë©ëë€. ë¬Œë¡ ë€ë¥ž ìí€í ì²ì ëíŽ ì¶ë¡ íêž°ë ìŽë¯ž ìŽë µì§ë§ ìì í ë€ë¥ž 구íìŒë¡ ìžíŽ ìì í ë¶ê°ë¥í©ëë€.
ë짞, "ê°ëší"ì룚ì ì ì¬ì©íì¬ ì§êž ë²€ì¹ ë§í¬ë¥Œ ìì§íê³ ì€ì ìœëì ì±ë¥ íê·ê° ììì ë°ê²¬íë©Ž (ê·žëŠ¬ê³ ëŽê° ììíë tbh), ìëíë 묞ì 륌 겪ì íìì¡°ì°š ììµëë€. ìŽ ìœë 겜ë¡ë¥Œ ëì± ìµì ííììì€.
ë§ì§ë§ìŒë¡, cvttss2si
ë¹ëíë ê²ìŽ ì§êž ì°ëŠ¬ê° ê°ì§ê³ ìë ê²ë³Žë€ ë ë¹ ë¥Œ ì§ì¡°ì°š íì íì§ ëª»í©ëë€ (ARMììë ì ì í ëª
ë ¹ìŽë¥Œ ì¬ì©íë ê²ìŽ ë¶ëª
í ë ë«ìµëë€).
ë²€ì¹ë§í¹ 결곌ì êŽê³ììŽ ë§ì unsafe fn as_u32_unchecked(self) -> u32
ì ì¹êµ¬ë€ìŽ íìí ê²ìŽëŒê³ ê°ì íë ê²ìŽ ìì í©ëê¹? ê·žë€ìŽ ëí륌 êŽì°° ê²°êµ ìì ê²œì° ëêµ°ê°ê° ìŽë€ ë€ë¥ž ì ì¬ì ìì§ í ê²ìŽë€?
@bstrie ê·žë° ê²œì°ìë 구묞ì as <type> [unchecked]
ë¡ íì¥íê³ unchecked
ê° unsafe
ìë§ ì¡Žì¬íëë¡ ì구íë ê²ê³Œ ê°ì ìì
ì ìííë ê²ìŽ ë í©ëŠ¬ì ìŽëŒê³ ìê°í©ëë€ as <type> [unchecked]
컚í
ì€íž.
ëŽê°ë³Žêž°ì _unchecked
ì í¬ë ì€ížê° as
ìºì€í
ì ë³íìŒë¡ ìëíë ê²ì ì§êŽì ìŽê³ ì¬ì© ê°ë¥í 묞ì륌 ìì± í ë ì¬ë§ê· ìŒ ê²ì
ëë€.
@ssokolow 구묞 ì¶ê°ë íì ìµíì ìëšìŽëìŽìŒí©ëë€. í¹íìŽ ëªšë ê²ìŽ ëš 10 ê°ì ìí íšìë¡ ì²ëŠ¬ ë ì ìë€ë©Ž ëì± ê·žë ìµëë€. ì¬ì§ìŽ ê°ë ìŒë°ì ìž foo.as_unchecked::<u32>()
í¹í ì°ëŠ¬ê°íì§, ê°ì ìŠê°ëìŽìŒíë€ ìŽí 구묞 ë³ê²œ (ê·žëŠ¬ê³ ìë° ëìë bikeshed)íë ê²ìŽ ë°ëì§ í ê²ìŽë€, ê·ž ì¬ë¬Œì ì unsafe
ì êžì íŽì í©ëë€.
í¬ìžíž. í°ë³Ž íŒì¬ë ìµì ì ê³ ë €í ë ë§ìì ììê³ , ëìŽìŒ 볎멎 ì€ë ì ë ìë 몚ë ì€ëŠ°ë륌 ì íí ë°ì¬íì§ ììêž° ë묞ì ì€ê³ ê²°ì ì ëíŽ ë ì ì€íê² ìžêžíŽìŒíìµëë€.
ìŠ, ëì ì íì íšì ìŽëŠìŒë¡ 굜ë ê²ì ì못ë ëëì ëë€. í°ë³Ž íŒì¬ê° ë ëì ì í ì§ìž ê² ê°ìµëë€.
ìŒë° ë©ìëë From
/ Into
ë° unsafe fn
ë©ìë륌 í¬íšíë UncheckedFrom
/ UncheckedInto
ížë ìŽ ížì ìë¡ìŽ ìžížì ìíŽ ì§ì ë ì ììµëë€ unsafe fn
TryFrom
/ TryInto
컬ë ì
.
@bstrie ìœëê° ëë €ì§ ì¬ëë€ììí ëì ì€ íëë Ʞ볞 íëìšìŽ ëª
ë ¹ìŽì ì¡ìžì€íêž° ìíŽ ëŽì¥ íšì (ì : 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)
}
}
êŽë šìë ì¬ë¯žìë ì¬ì€ : "ìëŒ ëŽêž°ë³Žë€ ë³í"ìœë ìì±ì Super Mario 64ìì " ë³ë ¬ ì°ì£Œ "ê²°íšì ìŒìŒí€ë ììžì ëë€. 충ë ê°ì§ ìœëë 뚌ì MIPS ëª ë ¹ìŒë¡ f32 ì¢í륌 i32ë¡ ë³í í ë€ì i16ìŒë¡ ìëŠ ëë€. ë°ëŒì i16ìë ë§ì§ë§ i32 'wrap'ìë ë§ì§ ìë ì¢í, ì륌 ë€ìŽ 65536.0 ì¢íë¡ ìŽëíë©Ž 0.0ì ëí 충ë ê°ì§ë¥Œ ì»ì ì ììµëë€.
ìŽìšë ê²°ë¡ :
minss %xmm2, %xmm1
maxss %xmm3, %xmm1
cvttss2si %rax, %xmm1
3 ê°ì ëª ë ¹ìŽ (ì ë¹í ìœë í¬êž°ì ì²ëŠ¬ë / ëêž° ìê°ìŽ ìì)ìŽë©° ë¶êž°ê° ììµëë€.
íë:
ë ê°ì§ ì ê·Œ ë°©ì ì¬ìŽì ííì ì ìí©ëë€.
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
ê° ë묎 ì ìŒë©Ž 0x8000000000000000ìŽ ìŽë¯ž ì ëµ ìž ê²ì²ëŒ ìì§í ì ê·Œ ë°©ì곌 ë¹êµíì¬ íëì ë¹êµë¥Œ ì ì¥í©ëë€ (ì : i64 :: MIN).
f32ìì i32ê¹ì§ì ê²œì° ìŽì 곌 ëìŒí ìì ì ìííë ê²ìŽ ë°ëì§í ì§ ëë 뚌ì f64ë¡ ë³í í ë€ì ë 짧ì ìµì / ìµë ìì ì ìííë ê²ìŽ ë ëìì§ íì€íì§ ììµëë€.
u64
ì (ë) ìê°íê³ ì¶ì§ ìì ìë§ì
ëë€. :íŒ
ë²€ì¹ ë§í¬ ìì² : https://internals.rust-lang.org/t/help-us-benchmark-saturating-float-casts/6231
https://internals.rust-lang.org/t/help-us-benchmark-saturating-float-casts/6231/14ìì ëêµ°ê° ìŽë¯žì§ ìì륌 ì¬ì©í JPEG ìžìœë©ìì ìž¡ì ê°ë¥íê³ ìë¹í ìë ì íë¥Œë³Žê³ íìµëë€. íë¡ê·žëšì ìµìííì¬ ì첎 í¬íšëê³ ëë¶ë¶ ê°ì곌 êŽë šë ë¶ë¶ì ìŽì ì ë§ì¶ ììµëë€ : https://gist.github.com/rkruppe/4e7972a209f74654ebd872eb4bc57722 ìºì€íž).
ìºì€ížë ëìŒí ë¹ìšì f32-> u8 ( rgb_to_ycbcr
) ë° f32-> i32 ( encode_rgb
, "ììí"룚í)ì
ëë€. ëí ì
ë ¥ìŽ ëªšë ë²ì ëŽììë ê²ì²ëŒ 볎ì
ëë€. ìŠ, í¬íê° ì€ì ë¡ ììëì§ë ìì§ë§ f32-> u8ì ê²œì° ë€íìì ìµì ë° ìµë륌 ê³ì°íê³ ë°ì¬ëŠŒ ì€ë¥ë¥Œ ì€ëª
íì¬ íìží ì ììµëë€. 묌ìŽë³Œ ê²ìŽ ë§ìµëë€. f32-> i32 ìºì€ížë i32ì ë²ìì ë ë¶ëª
íì§ë§ self.tables
ì ììê° 0ìŽ ìëêž° ë묞ì ìµì í íë¡ê·žëšìŽ í¹í ìë íë¡ê·žëšìì íìíêž°ê° ìœì§ ììµëë€. 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ìŒë¡ ë§ëëë€. x86_64ìì % ë늜ëë€. ìŽë LLVM 6ìŽ ì묎ê²ë ë³ê²œíì§ ìì ìì ì믞í©ëë€.
| íëê·ž | íìŽë° |
| ------- | ------- : |
| -Copt-level = 3 -Ctarget-cpu = native | 325,699ns / iter (+/- 7,607) |
| -Copt-level = 3 -Ctarget-cpu = native -Zsaturating-float-casts | 386,962ns / iter (+/- 11,601)
(19 % ë늌) |
| -Copt-level = 3 | 331,521ns / iter (+/- 14,096) |
| -Copt-level = 3 -Zsaturating-float-casts | 413,572ns / iter (+/- 19,183)
(25 % ë늌) |
@kennytm LLVM 6ìŽ ë¬Žìžê°ë¥Œ ë°ê¿ ê²ìŒë¡ ìì íìµëê¹? ìŽ ì¬ì© ì¬ë¡ì ëììŽ ë í¹ì ê°ì ì¬íì ëíŽ ë Œìíê³ ììµëê¹? ê·žë ë€ë©Ž í°ìŒ ë²ížë 묎ìì ëê¹?
@insanitybit ... ìì§ ìŽë €ìë ê² ê°ìµëë€ ...?
ì°í, ëŽê° ë 뎀ëì§ ì í ëª°ëŒ ê°ì¬!
@rkruppe ë float to int ìºì€ížê° ë ìŽì LLVMìì UBê° ìëì§ íìžíì§ ìììµëë€.
(묞ì ë³ê²œ)?
2018 ë 7 ì 20 ìŒ ì€ì 4:31ì "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
ì íìŒë¡ ìì¹ë¥Œ ê·Œì¬ííë €ê³ í©ëë€.
ì, ê·žë ìµëë€.
2018 ë 7 ì 20 ìŒ êžììŒ 12:24 Robin 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
.
LLVM 7 ëŠŽëŠ¬ì€ ë žížìë ë€ì곌 ê°ì ëŽì©ìŽ ìžêžëìŽ ììµëë€.
ë¶ë ììì íë³íì ìµì íê° í¥ìëììµëë€. ìŽë¡ ìžíŽ ìºì€íž ì€ë²íë¡ì ì ìëì§ ìì ëìì ìì¡Žíë ìœëì ëíŽ ëëŒìŽ ê²°ê³Œê° ë°ìí ì ììµëë€. íšì ìì± "strict-float-cast-overflow"= "false"륌 ì§ì íì¬ ìµì í륌 ë¹íì±í í ì ììµëë€. ìŽ ìì±ì clang ìµì -fno-strict-float-cast-overflowë¡ ë§ë€ ì ììµëë€. ìœë ìë íìŽ ì 륌 ì¬ì©íì¬ ìí¥ìë°ë íšíŽì ê°ì§ í ì ììµëë€. ìŽ ë¬žì ë§ ê°ì§íë clang ìµì ì -fsanitize = float-cast-overflowì ëë€.
ìŽ ë¬žì ì êŽë šìŽ ììµëê¹?
ìì íì§ ìì ì ìëì§ ìì ëììŽ ìëëŒë©Ž LLVMìŽ ì€ë²íë¡ ìºì€ížì ëíŽ ë¬Žììíëì§ ì 겜 ì°ì§ ìììŒí©ëë€. 결곌ë ë¶ê±Žì í ëìì ì ë°íì§ ìë í ì°ë êž°ê° ë ì ììµëë€.
ìŽ ë¬žì ì êŽë šìŽ ììµëê¹?
ë³ë¡. UBë ë³ê²œëì§ ììê³ , LLVMììŽë¥Œ ì ì©íë ë° íšì¬ ë 공격ì ìŽìŽì ì€ì ë¡ë ìí¥ì ë°êž° ìœê² ë§ë€ìì§ ë§ ê±Žì ì± ë¬žì ë ë³íì§ ìììµëë€. í¹í ì ìì±ì UB륌 ì ê±°íì§ ìê±°ë LLVM 7 ìŽì ì ì¡Žì¬íë ìµì íì ìí¥ìì£Œì§ ììµëë€.
@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
ë ìì§ë§ ìžëŒìž ìŽì
ëžëŠ¬ë¥Œ ì¬ì©íì¬ ë¶ë ììì ì ì ìë¡ ë³ííë ëì ìí€í
ì²ì ëª
ë ¹ì ì¡ìžì€ í ì ììµëë€ (ì : í¬í as
ë¡ ë첎). ìŽë¡ ìžíŽ ìŒë¶ ìµì íê° ìµì ë ì ìì§ë§ ìŒë¶ ë²€ì¹ ë§í¬ìì ëë¶ë¶ íê·ë¥Œ ìì íë ê²ìŒë¡ 충ë¶í ì ììµëë€.
ìŽ ë¬žì ì êŽí UB륌 ì ì§íë unsafe
íšì (íì¬ as
ì ê°ì ë°©ììŒë¡ ìœë ìì±ëš)ë ë ë€ë¥ž ìµì
ìŽì§ë§ íšì¬ ë ë§€ë ¥ì ì
ëë€. d ìì
ì ìí í ì ìë€ë©Ž ìì í êž°ë¥ì ì íží©ëë€.
ëí ìì í í¬í float-to-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
(ëë ì ì¬í ëª
ë ¹)ì ëíŽ íì©ëìŽìŒíë€ê³ ìê°í©ëë€. ë°ëŒì ì¬ì©íì§ ìë ê²œì° ì ê±° í ììë ë¶í¬ëª
í ëžë ë°ì€ ìŒë¿ì
ëë€. 죌ì êžì§ ìµì í 맀ì°, LLVMì ëŽë¶ì ìžëŒìž ìŽì
ëžëŠ¬ì 결곌 ê°ì ëíìë ìŽì ê° ììµëë€. ë§ì§ë§ ë¹ížë @sunfishcode ê° ì±ë륌 ì ìíë ìœë ìíì€ì ëíŽ ìžëŒìž asmì ì¬ì©íë ê²ì ëíŽ íìì ìž ìŽì ì
ëë€. ì±ëì ëíŽ ëì
ë ê²ì¬ë ì€ë³µëë ê²œì° ì€ëë ì ê±° ë ì ìì§ë§ ìžëŒìž asm ëžë¡ì ë¶êž°ë t ëšìí.
ë€ë¥ž ì¬ëë€ìŽ ê·žë¬í ì ëµì ë°ëí ê¹ì? ê·žëììŽ ë¬žì 륌 íŽê²°í ë§íŒ ì€ìíì§ ìë€ê³ ìê°í©ëê¹?
ëë ì§êž í¬í ìí륌 ë°êŸžê³ ëì€ì ëìì ì¶ê°íë ê²ì ë°ëíì§ ììµëë€. ëë í©ì륌 ìŽëìŽ ëŽê³ ìœëê° ëë €ì§ ì¬ì©ììê² ì ë¹ííŽìŒíë ì¬ëìŽëê³ ì¶ì§ ììµëë€ ð
LLVMìì float륌 int ìºì€ížë¡ í¬íìí€êž°ìí ëŽì¥ íšì륌 구ííêž°ìí ìì ì ììíìµëë€. https://reviews.llvm.org/D54749
ê·žê²ìŽ ìŽëë¡ ë ê°ë©Ž í¬í ì믞륌 ì»ë ë¹êµì ë®ì ì€ë² í€ë ë°©ë²ì ì ê³µí©ëë€.
ìŽ ì ìëì§ ìì ëìì ìŽë»ê² ì¬íí©ëê¹? ëêžìì ìì 륌 ìëíì§ë§ 결곌ë 255
ìëë°, ëìê² êŽì°®ì 볎ì
ëë€.
println!("{}", 1.04E+17 as u8);
ì ìëì§ ìì ëìì ê·žë° ììŒë¡ ìì ì ìŒë¡ êŽì°° í ì ììŒë©° ëë¡ë ìì íëë¡ ì ê³µëì§ë§ ë ë³µì¡í ìí©ììë ê³ ì¥ìŽ ë°ìí©ëë€.
ê°ëší ë§íŽ, ì°ëŠ¬ê° ì¬ì©íë ìœë ìì± ìì§ (LLVM)ì ìŽë° ìŒìŽ ë°ìíì§ ìëë€ê³ ê°ì í ì ììŒë¯ë¡ìŽ ê°ì ì ìì¡Žíë©Ž ì못ë ìœë륌 ìì± í ì ììµëë€.
ëë ë§ì§ë§ ìœë©ížê° ìŽì ìœë©íž ì êŽë šíì¬ @ AaronM04륌 ìí ê²ìŽëŒê³ ê°ì íë€.
"ì€, ê·žëŒ ì¶©ë¶í ìœ ë€ì."
ì£ì¡í©ëë€. ì ë ì¢ì ìëì 6 ë ìì¬ë¥Œ 맀ì°ì£Œì ê¹ê² ìœììµëë€. íì§ë§ ì§ì§íê², 10 ë ì€ 6 ë ! ì ì¹ìž í¬ëŒ ìŽìë€ë©Ž ì¬êž°ìì íì€ë¥Žë íꎎ íì륌 ììíì ê²ì ëë€.
ê·žë ë€ë©Ž ë구ë ì§ ê°ëší ë§ë¡ íŽëµì ì°Ÿë 곌ì ìŽ íŽë² ìì²Žë³Žë€ ë í¥ë¯žë¡ìì§ë ìŽì ë 묎ìì ëê¹?
ì²ìì 볎ìë ê²ë³Žë€ ìŽë µê³ LLVM ë³ê²œìŽ íìíêž° ë묞ì ëë€.
ì¢ì,íì§ë§ ë ë²ì§ž 죌ììŽ LLVMì ë§ë ì¬ëì ì ìŽ ìëìê³ , ê°ì ë°©í¥ìŒë¡ ëìê°ë ë°ìŽ 귌볞ì ìž ë¬žì 륌 íŽê²°íë ë° 15 ë ìŽ ë 걞늎 ì ììµëë€.
ì ë§, ëë ëêµ°ê°ë¥Œ íŽì¹ êŽì¬ìŽìê³ , ê°ìêž° ëìì죌Ʞ ìíŽ Rust ìžíëŒë¥Œ ì²ì ì íì§ë§,ìŽ ì¬ê±Žì ëíŽ ìê²ëìì ë ì ë ëëìµëë€.
ìŽ ë¬žì ì¶ì êž°ëìŽ ë¬žì 륌 íŽê²°íë ë°©ë²ì ë Œìíêž°ìí ê²ìŽë©° ëª ë°±í ê²ì ìžêžíë©Ž ââê·ž ë°©í¥ìŒë¡ ì§ì ìŽ ììµëë€. ë°ëŒì 묞ì íŽê²°ì ëê³ ì¶ê±°ë êž°ì¬í ìë¡ìŽ ì ë³Žê° ìë€ë©Ž ê·žë ê²íììì€. ê·žë ì§ ììŒë©Ž ê·íì ìê²¬ìŽ ë§ë²ì²ëŒ ìì ì¬íì íìíì§ ìì ê²ì ëë€. :)
ìŽê²ìŽ LLVMì ë³ê²œìŽ íìíë€ë ê°ì ì ìêž°ìì¡°ëŒê³ ìê°í©ëë€.
ìµìíì ì±ë¥ ë¹ì©ìŒë¡ ìžìŽë¡ í ì ìë€ê³ ìê°í©ëë€. ê·žê²ì íêž°ì ìž ë³íìŒê¹ì * * ê·žë ìµëë€. ê·žë¬ë ê·žê²ì í ì ìê³ , ìŽë£šìŽì žìŒí©ëë€.
ëŽ íŽê²°ì±
ì unsafe
ë¡ int ìºì€ížì float륌 ì ìí ë€ì íì€ libì ëª ê°ì§ ëì°ë¯ž íšì륌 ì ê³µíì¬ Result
ì íì ë°ìžë© ë 결곌륌 ì ê³µíë ê²ì
ëë€.
ê·žê²ì ì¹ìíì§ ìì ìì ìŽë©° 죌ì ë³ê²œ ì¬íìŽì§ë§ ê¶ê·¹ì ìŒë¡ 몚ë ê°ë°ìê° ìŽë¯ž êž°ì¡Ž UB륌 íŽê²°íêž° ìíŽ ì€ì€ë¡ ìœë©íŽìŒíë ê²ì ëë€. ìŽê²ìŽ ì¬ë°ë¥ž ë ¹ ë°©ìì ëë€.
@RalfJung , ìŽíŽíê² íŽì£Œì ì ê°ì¬í©ëë€. ëë ìì°ì ìž ëžë ìž ì€í ë° ê³Œì ì ëêµ°ê°ë¥Œ 몚ìíê±°ë 겜멞 ì ìŒë¡ ê°ì í ìëê° ìììµëë€. ë ¹ì ìë¡ë€ë ê²ì ì¬ì€ì ëë€. ëŽê° í ììë ìŒìŽë³ë¡ ììµëë€. ê·žëŒìë ë¶êµ¬íê³ ê·žê²ì ëì ë ¹ì¬ ë €íë ë€ë¥ž ì¬ëë€ìê² ëììŽëë©°, íŽê²°ëì§ ìì ê²°íšì ëíŽ ë ë§ìŽ ë°°ì°ê³ êŽë š 결곌륌ëŽë ë° ëììŽë©ëë€. ê·žë¬ë "ëŽ ìžëªšìë ëêž"ì ì ê±°íë ê²ìŽ íšì¬ ì¬ì ì§ ê²ìŽëŒë ì ì ìŽë¯ž êž°ì©ëë€.
ì€ë ëì ìë¶ë¶ìì ìžêžíë¯ìŽ êŽë š íìŽ ì€ë ì ì ëìíë¯ìŽ íìí ì믞 첎ê³ë¥Œ ì§ìíêž° ìíŽ llvmì ìì íì¬ ëëŠ¬ì§ ë§ íì€í ì¬ë°ë¥ž ë°©ë²ìŒë¡ ìì ëê³ ììµëë€.
ìŽ í ë¡ ì ë ìŽì ì¶ê° í ììë ê²ì ììµëë€.
@nikic LLVM ìž¡ì ì§íìŽ ì€ëš ë ê² ê°ìµëë€. ê°ë¥íë©Ž ê°ëší ì ë°ìŽížë¥Œ ì ê³µ í ì ììµëê¹? ê°ì¬.
saturating castë ì¬ì©ìê° soundess륌 ì»êž° ìíŽ ì¬ì íê·ë¥Œ ì¬ì©íë €ë ê²œì° ì íí ììë ëŒìŽëžë¬ëŠ¬ êž°ë¥ìŒë¡ 구íí ì ììµëê¹? 컎íìŒë¬ì 구íì ìœê³ ìì§ë§ ë§€ì° ë¯žë¬í ê² ê°ìµëë€.
ì°ëŠ¬ë -Z
íëê·žì êŽê³ììŽ ì±ë륌 ìíŽ LLVM IRì ìì±íë ëŽì¥ (íì¬ ì€í ìœë© ë IR ëë í¥í llvm.fpto[su]i.sat
ì ë
žì¶ í ì ììµëë€. ê·žê²ì ì í ìŽë µì§ ììµëë€.
ê·žë¬ë ëë ê·žê²ìŽ ìµì ì íë 방칚ìžì§ ê±±ì ë©ëë€. (if?) ì±ëê° as
ìºì€ížì Ʞ볞 ì믞ê°ëë©Ž ìŽë¬í APIë ì€ë³µë©ëë€. ëí ìŒìì ìŒì§ëŒë ì¬ì©ìê° ê±Žì ì± ëë ì±ë¥ì ìíëì§ ì€ì€ë¡ ì ííŽìŒíë€ê³ ë§íë ê²ë ì¢ì§ ìì ê² ê°ìµëë€.
ëìì íì¬ ìí©ì íšì¬ ë ëë¹ ì¡ìµëë€. ëŒìŽëžë¬ëŠ¬ API륌 ì¶ê° í ìê°ìŽëŒë©Ž Ʞ볞ì ìŒë¡ ì±ë륌 íì±ííê³ NaNì UBê° ìê³ ë²ì륌 ë²ìŽë ì«ìê°ìë unsafe
ëŽì¥ íšì륌 ì ê³µíëë¡ ì ì ë ê²œê³ íê³ ììµëë€. ìŒë° fpto[su]i
). ê·žê²ì ì¬ì í ââꞰ볞ì ìŒë¡ ëìŒí ì íì ì ê³µ í ê²ìŽì§ë§, Ʞ볞ì ìŒë¡ 걎ì ì±ì ì ê³µ í ê²ìŽë©°, ìë¡ìŽ APIë 믞ëì ì€ë³µëì§ ìì ê²ì
ëë€.
Ʞ볞ì ìŒë¡ ìëŠ¬ë¡ ì ííë©Ž ì¢ì ì늬ê°ë©ëë€. ëë ì°ëŠ¬ê° ì²ìë¶í°ê° ìëëŒ ìì²ì ë°ëŒ ê²ìŒë¥ž ëŽì¬ë¥Œ ì ê³µ í ì ìë€ê³ ìê°í©ëë€. ëí const evalììŽ ê²œì°ìë ì±ë륌 ìíí©ëê¹? (cc @RalfJung @eddyb @ oli-obk)
CONST íê° ì°ëŠ¬ê° ìŽë¯ž í¬íìíê³ ì°ë ¹ëì ê·žë ê²ìë€ê°, ì¬ì§ìŽ 믞늬 ì ì ìê° (ëë ë¶ëª
í ê·žê²ì ë³ê²œ êž°ìµ ë llvm::Constant
êž°ë° íê°ì).
ížì ëŽì ê°êž° 묞ì ì ìœëì ëíŽ ì ìê³ ììŒë¯ë¡ Ʞ볞ê°ì ì ííë ë° ìì¥ììê² ìµëê¹?
ë¿¡ë¿¡
ì±ë륌 ìíŽ LLVM IRì ìì±íë ëŽì¥ íšì륌 ë žì¶ í ì ììµëë€.
ìì€ ë° ëì ì íì ê° ì¡°í©ì ëíŽ 10 ê° ëë 12 ê°ì ê°ë³ ëŽì¥ íšìê° íìí ì ììµëë€.
ìŒížëŠŽ
Ʞ볞ì ìŒë¡ ìëŠ¬ë¡ ì ííë©Ž ì¢ì ì늬ê°ë©ëë€. ëë ì°ëŠ¬ê° ì²ìë¶í°ê° ìëëŒ ìì²ì ë°ëŒ ê²ìŒë¥ž ëŽì¬ë¥Œ ì ê³µ í ì ìë€ê³ ìê°í©ëë€.
ë€ë¥ž 죌ì곌 ë¬ëŠ¬ "ëŽì¬"ë as
ê° í¬í ìí ìŒ ë ë ì ì ì í íê·ë¥Œ ê°ë ê²ì ì믞íë€ê³ ê°ì í©ëë€.
ëë ìŽê²ìŽ ìë €ì§ ì€ìí íê·ë¥Œ ë€ë£šë ì¢ì ì ê·Œ ë°©ììŽëŒê³ ìê°íì§ ììµëë€. ìŒë¶ ì¬ì©ìì ê²œì° ì±ë¥ ìì€ìŽ ì€ì 묞ì ê° ë ì ìì§ë§ ìê³ ëŠ¬ìŠì ì ë ¥ìŽ íì ë²ì ëŽì ìëì§ íìží©ëë€. ìŽ ì€ë ëì ê°ì íì§ ìì ê²œì° ë³ê²œ ì¬íìŽ Stable ì±ëì ëë¬íì ëë§ ìí¥ì ë°ëë€ë ê²ì ì ì ììµëë€. ìŽ ìì ìì ìì² ìŠì ìì íì§ ìì API륌 ì ê³µíëëŒë 6 ~ 12 죌 ëì ë©ì¶ ì ììµëë€.
ì€íë € ì¬ì© ì€ëš ê²œê³ ì ëíŽ ìŽë¯ž ì€ì ë íšíŽì ë°ë¥Žê³ ì¶ìµëë€. íëì Stableìì ëìì ì¬ì©í ììê² ë íì ë§ ââNightlyìì ì ííììì€.
ìì€ ë° ëì ì íì ê° ì¡°í©ì ëíŽ 10 ê° ëë 12 ê°ì ê°ë³ ëŽì¥ íšìê° íìí ì ììµëë€.
ì¢ì, ë ì¡ìì§ë§ ê·žê² ìŽë€ êŽë šìŽ ìëì§ ëªšë¥Žê² ìŽ? 30 ê°ì ëŽì¥ íšì륌 ì¶ê°íë ê²ì ì¬ì í ââì¬ìí ìŒì
ëë€. ê·žë¬ë ì€ì ë¡ë N ì¬ ëíŒìì ì¬ì©íë ëšìŒ ìŒë° ëŽì¥ íšì륌 ì¬ì©íë ê²ìŽ íšì¬ ë ìœìµëë€. " as
ì¬ìŽë륌 ë§ë€ê³ unsafe
ìºì€íž API ëì
"ìµì
ì ì ííŽë ì«ìë ë³ê²œëì§ ììµëë€.
ëë ìŽê²ìŽ _ ìë €ì§ _ ì€ìí íê·ë¥Œ ë€ë£šë ì¢ì ì ê·Œ ë°©ììŽëŒê³ ìê°íì§ ììµëë€. ìŒë¶ ì¬ì©ìì ê²œì° ì±ë¥ ìì€ìŽ ì€ì 묞ì ê° ë ì ìì§ë§ ìê³ ëŠ¬ìŠì ì ë ¥ìŽ íì ë²ì ëŽì ìëì§ íìží©ëë€. ìŽ ì€ë ëì ê°ì íì§ ìì ê²œì° ë³ê²œ ì¬íìŽ Stable ì±ëì ëë¬íì ëë§ ìí¥ì ë°ëë€ë ê²ì ì ì ììµëë€. ìŽ ìì ìì ìì² ìŠì ìì íì§ ìì API륌 ì ê³µíëëŒë 6 ~ 12 죌 ëì ë©ì¶ ì ììµëë€.
+1
몚ë ëŠŽëŠ¬ì€ ì±ëìì ê²œê³ ìë ìí륌 ì ì§íë ê²ë³Žë€ 몚ë ëŠŽëŠ¬ì€ ì±ëìì ì±ë¥ íê·ìë ìí륌 ì ì§íë ê²ìŽ ë ì€ìíŽ ë³ŽìŽêž° ë묞ì ì¬ì© ì€ëš ê²œê³ ì ì°š (êµì²Žê° ìì ë ê²œì° ìŒê°ìë§ ì¬ì© ì€ëš)ê° íìíì§ íì€íì§ ììµëë€. íì§ë§ ë€ì 12 죌 ë êž°ë€ëŠ¬ë ê²ì Ʞ볞ì ìŒë¡ìŽ 묞ì ê° ìŒë§ë ì€ë ì§ìëìëì§ì ëí ë°ì¬ëŠŒ ì€ë¥ì ëë€.
ëí -Zsaturating-float-casts
ë ê·žëë¡ ëìŽëë©ëë€ (êž°ë³žê° ë§ ë³ê²œ). ìŠ, ìŒê° ì¬ì©ìë ì ì ëì ê³ìíŽì cangeìì ìµíž ìì í ì ììµëë€.
(ì, ëŽì¥ íšìì ìë 구í ìžë¶ ì¬í ìŒ ë¿ìŽë©° ìŽë€ ê²ì ëí 죌ì¥ìŽë ë°ëì ìë¯žê° ìëëë€.)
ëŽê° ì¬êž°ì ì견ì 몚ë ìí í ê²ìŒë¡ ì£Œì¥ í ì ììµëë€,íì§ë§ ë LLVMìŽ ìë€ë ìžììŽë€ @rkruppe ì§êž , ë°ë¡ ì¬êž° UB ì ê±°ì "ìµëš 겜ë¡ë¥Œ"ì°šëš í목ìŽìë€ ëê²° ëª ë ¹ì ê°ì§ê³ ìë€?
freeze
ìŽ ë묎 ìë¡êž° ë묞ì ì°ëŠ¬ì LLVM ë²ì ììë ì¬ì©í ì ìì ìë ììµëë€. ê·žëë ìë§ë 2020 ë
ìë°êž°ì ê°ë°ì 몚ìíŽìŒ í ê² ê°ìµëê¹?
ìŽ ìì ìì ì°ëŠ¬ê° ìíë 겜ë¡ì ëí ëëµì ìž í©ì륌 ì»êž° ìíŽ T- 컎íìŒë¬ íììì í ë¡ ì ìíŽ ì§ëª í©ëë€.
freeze
ì ì¬êž°ì ìžêž ë 몚ë ìŽì ë¡ ì¬ì í 묞ì ê° freeze
ê° ììì ì°ë êž° ëë ë¹ë° í€ë¥Œ ë°í í ê²ìŒë¡ ììë©ëë€. (ìŽëê°ìì ìšëŒìžìŒë¡ ìœìê³ ììœìŽ ì ë§ ë§ìì ëëë€. : D)
ìŽìšë 묎ìì ì°ë Ʞ륌 ë°ííë ê²ì¡°ì°š as
ìºì€ížìë ë€ì ëë¹ ë³Žì
ëë€. unchecked_add
ì ì ì¬íê² íìí ê²œì° ìë륌 ìíŽ ë ë¹ ë¥ž ìì
ì ìííë ê²ìŽ í©ëŠ¬ì ìŽì§ë§ êž°ë³žê° ìŽ Rustì ì ì ì ìë¹í ë°íë ê²ì²ëŒ 볎ì
ëë€.
@SimonSapin ë¹ì ì 뚌ì ë°ë ì ê·Œë²ì ì ìíìµëë€ (Ʞ볞ê°ì ë¶ê±Žì / "ìŽìí"ìë¯žë¡ ìŽê³ ëª ì ì ìŒë¡ 걎ì í ë°©ë²ì ì ê³µí©ëë€). ëë ë¹ì ìŽ ê±Žì ì± (ì ì í ì í êž°ê° ìŽí)ì ë¶ìŽííë ê²ìŽ í©ëŠ¬ì ìŽëŒê³ ìê°íëì§ ëë ë ë«ë€ê³ ìê°íëì§ ëì€ì ë¹ì ì ì견ìì ë§í ì ììµëë€.
ë¿¡ë¿¡
ëë LLVMìŽ ìŽì ëê²° ëª ë ¹ì ê°ì§ê³ ìë€ë ìžìì ë°ê³ ìëë°, ìŽê²ì ì¬êž°ì UB륌 ì ê±°íë "ìµëš 겜ë¡"륌 ì°šëšíë í목ìŽììµëë€. ë§ìµëê¹?
ëª ê°ì§ì£Œì ì¬íìŽ ììµëë€. ê°ì¥ ì€ìí ê²ì UB륌 ì ê±°íê³ ë²ë€ë¡ ì ê³µëë LLVMì freeze
(ìžì ë ì§ í ì ìì)ì í¬íšíëë¡ ì
ë°ìŽížíëëŒë ì¬ë¬ ìŽì ë²ì ì ì§ìí©ëë€ (ë€ì LLVM 6ìŒë¡ ìê°) 몚ë ì¬ì©ìì UB륌 ì€ì ë¡ ì ê±°íë €ë©Ž ë첎 구íìŽ íìí©ëë€.
ë짞, ë¬Œë¡ "UBê° ìëëŒ"ëŒë ì§ë¬žìŽ ì°ëŠ¬ê° ê·žê²ììë ëì ì°ëŠ¬ê° êŽì¬ì ê°ë ì ë¶ìžì§ ì¬ë¶ì
ëë€. í¹í freeze(fptosi %x)
ë§€ì° ë° ì§êŽì ìŒë¡ ìëíë€ë ì ì ë€ì ê°ì¡°íê³ ì¶ìµëë€. ìŽê²ì ë¹ ê²°ì ì ìŽë©° ì€íë ëë§ë€ ë€ë¥ž 결곌 ( @RalfJungìŽ ë§í ê²ì²ëŒ 믌ê°í ë©ëªšëŠ¬ìì ê°ì žìš 결곌ë)륌 ë°í í ì ììµëë€. ì§êž ë€ì ë
Œìíê³ ì¶ì§ë ìì§ë§ ì±ë륌 Ʞ볞ê°ìŒë¡ ë§ë€ê³ ì íëì§ ìì (ìì íì§ ìê±°ë freeze
ì¬ì©) ë³íì ë§ë€êž° ìíŽ ì¡°êž ë ë§ì ìì
ì ìííë €ë©Ž íììì ê³ ë €íŽ ë³Œ ê°ì¹ê° ììµëë€. Ʞ볞ê°ìŽ ìë ìµì
.
@RalfJung ëŽ ì
ì¥ì as
ë ì
ë ¥ ë° ì¶ë ¥ ì íì ë°ëŒ í¬ê² ë€ë¥ž ì믞 (ì늌, ì±ë, ë°ì¬ëŠŒ,âŠ)륌 ê°ì§ ì ìêž° ë묞ììŽ ë¬žì ì êŽê³ììŽ ìì í íŒíë ê²ìŽ ê°ì¥ ì¢ìµëë€. ìœë륌 ìœì ë ë¶ëª
í©ëë€. (íìì¡°ì°šë foo as _
ìŒë¡ ì¶ë¡ í ì ììµëë€.) ê·žëì ì ë as
ìŽ ì€ëë ìííë 겜ì°ë¥Œ í¬êŽíë ë€ìí ëª
ì ì ìŒë¡ ëª
ëª
ë ë³í ë°©ë²ì ì ìíêž°ìí ì¬ì RFC ìŽìì ê°ì§ê³ ììµëë€. .
ëŽ ìê° as
ê·žê²ì ì¬ì© ìžë¶ ë ì ìêž° ë묞ì íì€í, UBê° ììŽìŒ unsafe
. ì°ë Ʞ륌 ë°ë©íë ê²ë ì¢ì§ ììµëë€. ê·žë¬ë ì°ëŠ¬ë í¬í ìºì€ížë¡ ìží ì±ë¥ íê·ì ìë €ì§ ì¬ë¡ì ëíŽ ìŒì¢
ì ìí / ì í / ëìì ê°ì žìŒí©ëë€. ìŽ ì íì ëí RFC ìŽìì ì°šëšíì§ ìêž° ìíŽ í¬í ìºì€ížì ëŒìŽëžë¬ëŠ¬ 구íì ëíŽìë§ ì§ë¬žíìµëë€.
ë¿¡ ë¹µëš
ëŽ ì ì¥ììŽ ë¬žì ì êŽê³ììŽ ìì í íŒíë ê²ìŽ ê°ì¥ ì¢ìµëë€. ìëíë©Ž ê·žê²ì ë§€ì° ë€ë¥ž ì믞 (ì ëš, í¬í, ë°ì¬ëŠŒ,âŠ)륌 ê°ì§ ì ìêž° ë묞ì ëë€.
ëìí©ëë€. ê·žë¬ë ê·žê²ììŽ ë¬žì 륌 íŽê²°íë ë° ì€ì ë¡ ëììŽëì§ ììµëë€.
(ëí, as
ì (륌) íìë¡íì§ ìê² ë§ë€êž° ìíŽ ë
žë ¥íê³ ììŽ êž°ì©ëë€. êž°ëí©ëë€. : D)
ìì íì§ ìì ìžë¶ìì ì¬ì©í ì ìêž° ë묞ì UBê° ììŽìŒíë€ê³ ìê°í©ëë€. ì°ë Ʞ륌 ë°ë©íë ê²ë ì¢ì§ ììµëë€. ê·žë¬ë ì°ëŠ¬ë í¬í ìºì€ížë¡ ìží ì±ë¥ íê·ì ìë €ì§ ì¬ë¡ì ëíŽ ìŒì¢ ì ìí / ì í / ëìì ê°ì žìŒí©ëë€. ìŽ ì íì ëí RFC ìŽìì ì°šëšíì§ ìêž° ìíŽ í¬í ìºì€ížì ëŒìŽëžë¬ëŠ¬ 구íì ëíŽìë§ ì§ë¬žíìµëë€.
ê·žëì ì°ëŠ¬ë ìµì¢
ìíê° float-to-int as
í¬í ìí ì¬ìŒíë€ë ë° ëìíë ê² ê°ìµëë€. ëë ê·žê²ìŽ ì°ëŠ¬ê° í¥íê³ ìë ìµì¢
목í ìž í ìŽë€ ì í ê³íì ë§ì¡±í©ëë€.
ê·ž ìµì¢ 목íë ëìê² ì¢ì ê² ê°ìµëë€.
ëë ìŽê²ìŽ _ ìë €ì§ _ ì€ìí íê·ë¥Œ ë€ë£šë ì¢ì ì ê·Œ ë°©ììŽëŒê³ ìê°íì§ ììµëë€. ìŒë¶ ì¬ì©ìì ê²œì° ì±ë¥ ìì€ìŽ ì€ì 묞ì ê° ë ì ìì§ë§ ìê³ ëŠ¬ìŠì ì ë ¥ìŽ íì ë²ì ëŽì ìëì§ íìží©ëë€. ìŽ ì€ë ëì ê°ì íì§ ìì ê²œì° ë³ê²œ ì¬íìŽ Stable ì±ëì ëë¬íì ëë§ ìí¥ì ë°ëë€ë ê²ì ì ì ììµëë€. ìŽ ìì ìì ìì² ìŠì ìì íì§ ìì API륌 ì ê³µíëëŒë 6 ~ 12 죌 ëì ë©ì¶ ì ììµëë€.
ëŽ ìê°ì, íŽë¹ ì¬ì©ìê° 6-12 죌 ëì rustc ì ê·žë ìŽë륌 êž°ë€ëŠ¬ë©Ž ìžìì ì¢ ë§ìŽ ìë ê²ì ëë€. ë ê²œì° ëªšë ë€ê°ì€ë 늎늬ì€ìì ì묎ê²ë íìíì§ ìê±°ë ëŒìŽëžë¬ëŠ¬ì MSRV ì ìœìŽìì ì ììµëë€. ë°ì¹ë€.
ííž, ì€ë ëì ê°ì íì§ ìì ì¬ì©ìë ì±ë¥ ìì€ìŽ ë°ìí ììë ê²ì²ëŒ ì못 컎íìŒ ë ì ììµëë€. 묎ìì ì°ì ìíŽìŒí©ëê¹? ì°ëŠ¬ë ìì ì±ì ëí 볎ìŠì ì ê³µíê³ ìì ì ëí 볎ìŠì ì ê³µí©ëë€.íì§ë§ ì ê° ìë í ì±ë¥ì ëíŽìë ê·žë¬í 볎ìŠìŽ ì ê³µëì§ ììµëë€ (ì : RFC 1122ë ì±ë¥ì ì í ìžêžíì§ ìì).
ì€íë € ì¬ì© ì€ëš ê²œê³ ì ëíŽ ìŽë¯ž ì€ì ë íšíŽì ë°ë¥Žê³ ì¶ìµëë€. íëì Stableìì ëìì ì¬ì©í ììê² ë íì ë§ ââNightlyìì ì ííììì€.
ì§ì ì€ëš ê²œê³ ì ê²œì° ìì ì ìž ëììŽìì ëê¹ì§ ì§ì ì€ëšì êž°ë€ëŠ¬ë 결곌ë ì ìŽë ëŽê° ìë í ëêž° êž°ê° ëì 걎ì ì± êµ¬ë©ìŽ ë°ìíì§ ììµëë€. (ëí ì¬êž°ì ëŽì¥ íšì륌 ì ê³µ í ì ìì§ë§ ìŒë°ì ìž ê²œì° ê±Žì ì± êµ¬ë©ì ê³ ì¹ ë í©ëŠ¬ì ìŒë¡ ëìì ì ê³µíì§ ëª»í ì ììµëë€. ë°ëŒì ìì ì ìž ëìì ê°ë ê²ìŽ ìŽë €ìŽ ì구 ì¬íìŽ ë ì ìë€ê³ ìê°íì§ ììµëë€.)
ì¢ì, ë ì¡ìì§ë§ ê·žê² ìŽë€ êŽë šìŽ ìëì§ ëªšë¥Žê² ìŽ? 30 ê°ì ëŽì¥ íšì륌 ì¶ê°íë ê²ì ì¬ì í ââì¬ìí ìŒì ëë€. ê·žë¬ë ì€ì ë¡ë N ì¬ ëíŒìì ì¬ì©íë ëšìŒ ìŒë° ëŽì¥ íšì륌 ì¬ì©íë ê²ìŽ íšì¬ ë ìœìµëë€. "
as
ì¬ìŽë륌 ë§ë€ê³unsafe
ìºì€íž API ëì "ìµì ì ì ííŽë ì«ìë ë³ê²œëì§ ììµëë€.
ëšìŒ ì ë€ëŠ ëŽì¥ íšìë 12/30 í¹ì ëªšë ž ëªšíœ ìžì€íŽì€í륌 ìíŽ ì»ŽíìŒë¬ìì ë³ëì 구íì ì구íì§ ììµëê¹?
LLVMìŽ ìŽë¯ž ëë¶ë¶ì ìì ì ìííêž° ë묞ì 컎íìŒë¬ì ëŽì¥ íšì륌 ì¶ê°íë ê²ì ì¬ì í ì ìì§ë§ ì 첎 ë¹ì©ê³Œë ê±°ëŠ¬ê° ë©ìµëë€. ëí Miri, Craneliftì 구í ë° ì¬ìì íìí ìµì¢ ìì ìŽ ììµëë€. ê·žëì ëêµ°ê°ê° íìë¡íë êž°íì ëŽì¥ êž°ë¥ì ì¶ê°íŽìë ìëë€ê³ ìê°í©ëë€.
ê·žë¬ë ëë ë ë§ì ëŽì¬ë¥Œ ë žì¶íë ê²ì ë°ëíì§ë ìì§ë§ ëêµ°ê° ê·žê²ì íìë¡íë ê²œì° ì ì (ì : ì êµí ì€ëª ìŽìë PR)ì ë§ë€ê³ ë²€ì¹ë§í¹ ìì¹ ë±ìŒë¡ ì¶ê°ë¥Œ ì ë¹ííŽìŒí©ëë€.
ëí
-Zsaturating-float-casts
ë ê·žëë¡ ëìŽëë©ëë€ (êž°ë³žê° ë§ ë³ê²œ). ìŠ, ìŒê° ì¬ì©ìë ì ì ëì ê³ìíŽì cangeìì ìµíž ìì í ì ììµëë€.
ìŽê²ì ëìê² êŽì°®ì 볎ìŽì§ë§ ìŽë¯žìŽ íë귞륌 ì¬ì©íë ì¬ëë€ì ìíŽ ì믞륌 ë¶ê±Žì íê² ë³ê²œíì§ ìëë¡ íëê·ž ìŽëŠì -Zunsaturating-float-casts
ë¡ ë³ê²œíë ê²ìŽ ì¢ìµëë€.
ìŒížëŠŽ
ëšìŒ ì ë€ëŠ ëŽì¥ íšìë 12/30 í¹ì ëªšë ž ëªšíœ ìžì€íŽì€í륌 ìíŽ ì»ŽíìŒë¬ìì ë³ëì 구íì ì구íì§ ììµëê¹?
ìëì, ëë¶ë¶ì 구íì ìì€ ë° ëì ë¹íž íì ëí ë§€ê° ë³ìí륌 íµíŽ ìŽë¯ž ê³µì ë ì ììŒë©° ìŽë¯ž ê³µì ë©ëë€. ëª ë¹íž ë§ ëì 묞ì 구ë¶ìŽ íìí©ëë€. miriì 구íìë ëìŒíê² ì ì©ëë©° ë€ë¥ž 구í ë° ì¬ììë ì ì©ë©ëë€.
(ížì§ : ëª ííê² ë§íë©Ž,ìŽ ê³µì ë N ê°ì ê³ ì í ëŽì¥ íšìê°ìë 겜ì°ìë ë°ìí ì ìì§ë§ ëšìŒ ìŒë° ëŽì¥ íšìë ëŽì¥ íšìë³ë¡ íìí ìì©êµ¬ë¥Œ ì€ì ëë€.)
ê·žëì ëêµ°ê°ê° íìë¡íë êž°íì ëŽì¥ êž°ë¥ì ì¶ê°íŽìë ìëë€ê³ ìê°í©ëë€.
ê·žë¬ë ëë ë ë§ì ëŽì¬ë¥Œ ë žì¶íë ê²ì ë°ëíì§ë ìì§ë§ ëêµ°ê° ê·žê²ì íìë¡íë ê²œì° ì ì (ì : ì êµí ì€ëª ìŽìë PR)ì ë§ë€ê³ ë²€ì¹ë§í¹ ìì¹ ë±ìŒë¡ ì¶ê°ë¥Œ ì ë¹ííŽìŒí©ëë€. ê·žëì 걎ì ì± êµ¬ë©ì ê³ ì¹ë ê²ì ë§ììŒíë€ê³ ìê°íì§ ììµëë€.
ìŽë¯ž ë²€ì¹ë§í¹ ìì¹ê° ììµëë€. ì€ë ì ë²€ì¹ ë§í¬ ìì²ì íµíŽ JPEG ìžìœë©ìŽ í¬í ìºì€ížë¥Œ ì¬ì© ìë¹í ëë €ì§ë€ ë ê²ì ìê³ ììµëë€. ëêµ°ê° ë€ì ì€íí ì ìì§ë§ ìŽê²ìŽ ë³ê²œëì§ ììë€ê³ íì íê³ (ë¬Œë¡ í¹ì ì«ìê° ëìŒíì§ë ìì§ë§) ì±ëê° êµ¬íëë ë°©ìì ëí í¥í ë³ê²œ (ì : ìžëŒìž asm ëë @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
) ëë ì°šìŽê° ì íìŽ ìë ìŒë šì ì í (ì 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ìì)륌 ê°ì§ê³ ìêž° ë묞ì "í° ì ìë¡ ë³í í ë€ì ì륎Ʞ"륌 "ìì ì ìë¡ ì§ì ë³í"ìŒë¡ ìµì ííë ê²ì ì³ì§ ììµëë€. / ìëŒëŒ ë ìë ë³í ê²°ê³Œê° ëí ë ê²œì° ë€ë¥ž 결곌 (êž°ê³ ìœë ìì€, ëë¶ë¶ì ìí€í ì²).
ì€ì©ì ìŒë¡ 128 ë¹íž ì ì륌 ì ìžíê³ 64 ë¹íž ì ìì ìŽì ì ë§ì¶ëëŒë ìŒë°ì ìž 32 ë¹íž ëììë ì¬ì í ì¢ì§ ììµëë€.
ëëìŽ ëíì ìµìíì§ ìì§ë§ íë¡ê·žëë°ìë ìµìíì§ ììµëë€. ì¬ëë€ìŽ í¬í ë³í곌 NaNì 0ìŒë¡ ë³ííë ê²ìŽ í©ëŠ¬ì ìž êž°ë³ž ëììŽëŒê³ ìê°íë ìŽì ê° ê¶êží©ëë€. Javaê°ìŽ ìì ì ìííë€ë ê²ì ìŽíŽí©ëë€ (ë©íìŽ íšì¬ ë ìŒë°ì ìŒë¡ 볎ìŽì§ë§), NaNìŽ ì€ì ë¡ ì¬ë°ë¥ž ë³íìŽëŒê³ ë§í ììë ì ì ê°ì ììµëë€. ë§ì°¬ê°ì§ë¡ ì륌 ë€ìŽ 1000000.0ì 65535 (u16)ë¡ ë³ííë ê²ì ì못ë ê² ê°ìµëë€. ë¶ëª í ì ëµ ìž u16ì ììµëë€. ì ìŽë C / C ++, C #, go ë° êž°íì ê³µì ëë ëì ìž 16960ìŒë¡ ë³ííë íì¬ ëìë³Žë€ ë«ë€ê³ ìê°íì§ ììµëë€. ë°ëŒì ì ìŽë ë€ì ëëì§ ììµëë€.
ì€ë²íë¡ ê²ì¬ìì ì ì¬ì±ì ëíŽ ì¬ë¬ ì¬ëìŽ ìžêž í ë° ììŒë©° ìŽì ëìí©ëë€. ëí ì ì륌 0ìŒë¡ ëëë ê²ê³Œ ì ì¬í©ëë€. ì못ë ë³íì ì못ë ì°ì ì²ëŒ ë¹í©íŽìŒíë€ê³ ìê°í©ëë€. NaN-> 0 ë° 1000000.0-> 65535 (ëë 16960)ì ìì¡Žíë ê²ì ì ì ì€ë²íë¡ ëë ê°ìì n / 0 == 0ì ìì¡Žíë ê²ë§ íŒ ì€ë¥ê° ë°ìíêž° ì¬ìŽ ê²ì²ëŒ 볎ì ëë€. Ʞ볞ì ìŒë¡ ì€ë¥ë¥Œ ìì±íŽìŒíë ì¢ ë¥ì ëë€. (ëŠŽëŠ¬ì€ ë¹ëìì rustë ì ì ì°ì 곌 ë§ì°¬ê°ì§ë¡ ì€ë¥ ê²ì¬ë¥Œ ì ê±° í ì ììµëë€.) ê·žëŠ¬ê³ ëë¬Œê² NaNì 0ìŒë¡ ë³ííê±°ë ë¶ë ììì í¬í륌 ê°êž°ë¥Œ _ ìíë 겜ì°ìë ë€ì곌 ê°ìŽ ì ííŽìŒí©ëë€. ì ì ì€ë²íë¡ë¥Œ ì ííŽìŒí©ëë€.
ì±ë¥ì êŽíŽìë ìŒë° ë³íì ìííê³ íëìšìŽ ê²°íšì ìì¡Žíë ê²ìŽ ê°ì¥ ëì ìŒë° ì±ë¥ì ì ê³µíë ê² ê°ìµëë€. ì륌 ë€ìŽ x86곌 ARM 몚ë ë¶ë ììì ìì ì ìë¡ì ë³íì ì¬ë°ë¥Žê² ííí ììë ê²œì° (NaN ë° ë²ì륌 ë²ìŽë ê²œì° ëªšë í¬íš) íëìšìŽ ììžë¥Œ ë°ììíµëë€. ìŽ ì룚ì ì ëë²ê·ž ë¹ëìì ë¶ë ììì ìì ìì ì ì ì íìŒë¡ ì§ì ë³ííë 겜ì°ë¥Œ ì ìžíê³ ë ì íšíì§ ìì ë³íì ì ìžíê³ ë¹ì©ìŽ ë€ì§ ììµëë€. ë묞 겜ì°ìŽì§ë§ ì¬ì í ë¹êµì ì ë ŽíŽìŒí©ëë€. (ìŽë¬í ììžë¥Œ ì§ìíì§ ìë ìŽë¡ ì ìž íëìšìŽììë ìíížìšìŽìì ì뮬ë ìŽì í ì ìì§ë§ ë€ì ëë²ê·ž ë¹ëììë§ ê°ë¥í©ëë€.) íëìšìŽ ììžë ì íí 0ìŒë¡ ì ì ëëꞰ륌 ê°ì§íë ê²ìŽ ì€ëë 구íëë ë°©ììŽëŒê³ ìê°í©ëë€. LLVMì ëí ë§ì ìŽìŒêž°ë¥Œ 볎ììŒë¯ë¡ ì¬êž°ì ì íìŽìì ì ìì§ë§ 볞ì§ì ìŒë¡ ì못ë ë³íì ëíŽ ëªšíží ë첎 ëìì ì ê³µíêž° ìíŽ ëŠŽëŠ¬ì€ ë¹ëììë 몚ë ë¶ë ììì ë³íìì ìíížìšìŽ ì뮬ë ìŽì ì ì¬ì©íë ê²ì ë¶íí ìŒì ëë€.
@admilazz ì°ëŠ¬ë LLVMìŽ í ììë ìŒì ì ìœì ë°ê³ ììŒë©° íì¬ LLVMì ì ìëì§ ìì ëìì ìíììŽ ì€ì륌 ì ìë¡ íšìšì ìŒë¡ ë³ííë ë°©ë²ì ë žì¶íì§ ììµëë€.
í¬í ìíë ìžìŽê° as
ìºì€ížë¥Œ íì ì±ê³µíëë¡ ì ìíêž° ë묞ì ì°ì°ì륌 ëì íšë ìíë¡ ë³ê²œí ì ìêž° ë묞ì
ëë€.
ë§ì°¬ê°ì§ë¡ ì륌 ë€ìŽ 1000000.0ì 65535 (u16)ë¡ ë³ííë ê²ì ì못ë ê² ê°ìµëë€. ë¶ëª í ì ëµ ìž u16ì ììµëë€. ì ìŽë ëë ê·žê²ì 16960ìŒë¡ ë³ííë íì¬ ëìë³Žë€ ë ëì ê²ìŒë¡ ë³Žì§ ììµëë€.
ê·žê²ì ëìê² ë¶ëª íì§ ììêž° ë묞ì ì§ì í ê°ì¹ê° ìë€ê³ ìê°í©ëë€. 16960ì 1000000.0ì 충ë¶í íì ì ìë¡ ë³í í ë€ì 16 ê°ì íì ë¹ížë¥Œ ì ì§íêž° ìíŽ ì륞 결곌ì ëë€.
ìŽê²ì ~ìŽ ì€ë ëìì ìŽì ì ì ì ë ìµì ìŽ ìëë©° ~ (ížì§ : ì¬êž°ìì ì못ëììµëë€. ì°Ÿì§ ëª»íŽ ì£ì¡í©ëë€) íì¬ ëìë ìëëë€. Rustì íì¬ ëìì ë²ì륌 ë²ìŽë float-to-integer ë³íìŽ Undefined BehaviorëŒë ê²ì ëë€. ì€ì ë¡ ìŽê²ì ì¢ ì¢ ê°ë¹ì§ ê°ìŒë¡ ìŽìŽì§ë©° ìì¹ì ìŒë¡ ì못 컎íìŒ ë° ì·šìœì±ì ì ë°í ì ììµëë€. ìŽ ì€ë ëë 몚ë ê²ì ê³ ì¹ë ê²ì ëë€. Rust 1.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ì ì ìëì§ ìì ëìì ìíììŽ ì€ì륌 ì ìë¡ íšìšì ìŒë¡ ë³ííë ë°©ë²ì ë žì¶íì§ ììµëë€.
ê·žë¬ë ìë§ë ì ì ì€ë²íë¡ì ë§ì°¬ê°ì§ë¡ ëë²ê·ž ë¹ëììë§ ë°íì ê²ì¬ë¥Œ ì¶ê° í ì ììµëë€.
AFAIKë ë© ìŽëŒìŽë ìë¯žë¡ ì ì ížíë ì ìŒí ìŽì ë ìíížìšìŽ ì뮬ë ìŽì ì íšìšì±ì ëë€.
ë ë€ í ë žêž° ë묞ì wraparound ëë saturationì ì ížíì§ ìëë€ê³ ìê°íì§ë§ wraparoundë C / C ++, C #, go, ìë§ë D, ê·žëŠ¬ê³ íì€íê² rustì ë¹ì·í ë§ì ìžìŽìì ì¬ì©ëë ë°©ë²ìŽëŒë ìŽì ìŽ ììµëë€. ë ë§ì ê², ê·žëŠ¬ê³ ë ¹ì íì¬ íë (ì ìŽë ëëë¡)ìŽêž°ëí©ëë€. ìŠ, ì ì ì€ë²íë¡ì 0ìŒë¡ ëëêž°ì ê°ì ì íšíì§ ìì ì°ì ì ëíŽ ìííë ê²ì²ëŒ "ì못ë ë³íì ëí íšë (ìë§ë ëë²ê·ž ë¹ëììë§)"ìŽ ìŽìì ìŽëŒê³ ìê°í©ëë€.
(í¥ë¯žë¡ê²ë ëìŽí° ìì 16960ì ì»ììµëë€. ê·žë¬ë ê²ì ë ë€ë¥ž ììì ë ¹ìŽ ë€ë¥Žê² ìëíë€ë ê²ì ì ì ììµëë€ ...)
í¬í ìíë ìžìŽê° íì ì±ê³µíêž° ìíŽ ìºì€ížë¡ ì ìíêž° ë묞ì ì°ì°ì륌 ëì íšë ìíë¡ ë³ê²œí ì ìêž° ë묞ì ëë€.
ì°ëŠ¬ê° ìŽë¯žìŽ ìì ì ìí í ì¬ëë€ì 결곌ì êŽì¬ìŽìë í ìì ì íê° ëìì ë³ê²œíë ê²ì ìŽë¯ž í° ë³íì ëë€. ìŽì²ëŒ ë¹í©íì§ ìë íëë ë°ë ì ììµëë€.
NaNìì íšëìŒë¡ ë§ë€ë©Ž 묎íëììë íšë í ì ìë€ê³ ìê°í©ëë€. ê·žë¬ë ìŽë 쪜ìŽë ë¹ ë¥Žê² ë§ë€êž°ê° ë ìŽë €ì ì§ ê² ê°ìµëë€.
ì ì ì€ë²íë¡ê° ê·žë ë¯ìŽ ëë²ê·ž ë¹ëììë§ íìžíë©Ž ë ê°ì§ ì¥ì ì 몚ë ì»ì ì ìë€ê³ ìê°í©ëë€. ë³íìŽ ì ííë€ë ê²ìŽ 볎ì¥ëê³ (ëë²ê·ž ë¹ëìì) ì¬ì©ì ì€ë¥ê° ì¡í ê°ë¥ì±ìŽ ë ëìŒë©° ìµíž ìž í ì ììµëë€. ë© ìŽëŒìŽë ë° / ëë ìíë ê²œì° ì±ëì ê°ì ìŽìí ëìì ëí ì±ë¥ì ê°ë¥í í ì¢ìµëë€.
ëí ëª ë ¹ ì€ ì€ìì¹ë¥Œ íµíŽìŽ í목ì ì ìŽíë ââê²ìŽ ìŽìíŽ ë³Žì ëë€. ê·žê²ì í° ë§ì¹ì ëë€. íì€í ë²ì륌 ë²ìŽë ë³íì ìíë ëìì ìê³ ëŠ¬ìŠì í¹ì±ì ë°ëŒ ë¬ëŒ ì§ë¯ë¡ ë³í ëšìë¡ ì ìŽíŽìŒí©ëë€. f.to_u16_sat () ë° f.to_u16_wrap () ëë ìŽì ì ì¬í ìµíž ìžì ì ìíê³ ìœëì ì믞륌 ë³ê²œíë ëª ë ¹ ì€ ìµì ìŽ ììµëë€. ê·žê²ì ìë¡ ë€ë¥ž ìœë ì¡°ê°ì íŒí©íê³ ìŒì¹ìí€ë ê²ì ìŽë µê² ë§ë€ê³ ê·žê²ì ìœë ê²ìŒë¡ 묎ììíëì§ ìŽíŽí ì ììµëë€ ...
ê·žëŠ¬ê³ "ì íšíì§ ìì ê²œì° íšë"ì Ʞ볞 ëììŒë¡ ë§ëë ê²ìŽ ì§ì ìŒë¡ ì©ë©ëì§ ìë 겜ì°ìŽë¥Œ 구ííì§ë§ ëë²ê·ž ë¹ëìì ì íšì± ê²ì¬ ë§ ìííë ëŽì¥ ë©ìë륌 ì¬ì©íì¬ (vast ëë¶ë¶?) ë³í í ëìŒí ì륌 ì»ì ê²ìŒë¡ ììëì§ë§ ëŠŽëŠ¬ì€ ë¹ëìì íëí°ë¥Œ ì§ë¶íì§ ìë 겜ì°.
í¥ë¯žë¡ê²ë ëìŽí°ìì 16960ì ì»ììµëë€.
ìŽê²ìŽ Undefined Behaviorê° ìëíë ë°©ìì ëë€. íë¡ê·žëšì ì íí ê³µìíì ì íí 컎íìŒë¬ ë²ì ë° ì íí 컎íìŒ íëê·žì ë°ëŒ ê²°ì ì ëììŽë 맀 ì€íë§ë€ ë³ê²œëë ê°ë¹ì§ ê° ëë ì못ë 컎íìŒìŽ ë°ìí ì ììµëë€. 컎íìŒë¬ë 묎ììŽë í ì ììµëë€.
ë© ìŽëŒìŽëë C / C ++, C #, go, ìë§ë D ë±ì ì¬ë¬ ìžìŽìì ì¬ì©ëë ë°©ë²ìŽëŒë ì¥ì ìŽ ììµëë€.
ì ë§ìžê°ì? ì ìŽë Cì C ++ììë ìëì§ë§ Rustì ê°ì Undefined Behavior륌 ê°ì§ê³ ììµëë€. ìŽê²ì ì°ì°ìŽ ìëëë€. ì°ëŠ¬ë ì£Œë¡ Cì C ++륌 구ííë clangì ìíŽ êµ¬ì¶ ë LLVMì ì¬ì©í©ëë€. C #ì ëíŽ íì íê³ ê°ìëê¹?
C11 íì€ https://port70.net/~nsz/c/c11/n1570.html#6.3.1.4
ì€ì ë¶ë íì ì í ê°ìŽ _BoolìŽ ìë ì ìíìŒë¡ ë³íëë©Ž ìì ë¶ë¶ìŽ ìì ë©ëë€ (ìŠ, ê°ìŽ 0ìŒë¡ ì늌). ì ì ë¶ë¶ì ê°ì ì ì ì íìŒë¡ íì í ììë ê²œì° ëììŽ ì ìëì§ ììµëë€.
ì ìíì ê°ìŽ ë¶ížìë ì íìŒë¡ ë³í ë ë ìíëë ëëšžì§ ì°ì°ì ì€ì ë¶ë íì ê°ìŽ ë¶ížìë ì íìŒë¡ ë³í ë ë ìí í íìê° ììµëë€. ë°ëŒì ìŽì ê°ë¥í ì€ì ë¶ë ê°ì ë²ìë (-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 ê°ì ì ì ì íìŒë¡ ë³ííë©ŽìŽ ê°ì ê°ì¥ ê°ê¹ìŽ ì ì ê°ìŒë¡ 0ìŒë¡ ë°ì¬ëŠŒë©ëë€. 결곌 ì ì ê°ìŽ ëì ì íì ë²ì륌 ë²ìŽëë©Ž 결곌ë ì€ë²íë¡ ê²ì¬ 컚í ì€ížì ë°ëŒ ë¬ëŒì§ëë€. íìž ë 컚í ì€ížììë OverflowExceptionìŽ throwëê³ íìžëì§ ìì 컚í ì€ížììë ê²°ê³Œê° ëì ì íì ì§ì ëì§ ìì ê°ì ëë€.
ë°ëŒì UBê° ìëëŒ "ì§ì ëì§ ìì ê°"ìŒë¿ì ëë€.
@admilazz ìŽê²ê³Œ ì ì ì€ë²íë¡ ì¬ìŽìë í° ì°šìŽê° ììµëë€. ì ì ì€ë²íë¡ë ë°ëì§íì§ ìì§ë§ ì ì ìëìŽ ììµëë€. ë¶ë ììì íë³íì ì ìëì§ ìì ëì ì ëë€.
ë¹ì ìŽ ì구íë ê²ì ëŠŽëŠ¬ì€ ëªšëìì Vec
ê²œê³ ê²ì¬ë¥Œ ëë ê²ê³Œ ë¹ì·íì§ë§ ì ìëì§ ìì ëìì íì©íêž° ë묞ì ì못ë ê²ì
ëë€.
ìì ìœëìì ì ìëì§ ìì ëìì íì©íë ê²ì ëŠŽëŠ¬ì€ ëªšëììë§ ë°ìíëëŒë íì©ëì§ ììµëë€. ë°ëŒì ìì ì¬íì ëŠŽëŠ¬ì€ ë° ëë²ê·ž 몚ë 몚ëì ì ì©ëìŽìŒí©ëë€.
ë¬Œë¡ ëë²ê·ž 몚ëìì ë ì íì ìž ìì ì í ì ìì§ë§ ëŠŽëŠ¬ì€ ëªšëì ëí ìì ì ì¬ì í ââì ì ìëìŽ ììŽìŒí©ëë€.
@admilazz ìŽê²ê³Œ ì ì ì€ë²íë¡ ì¬ìŽìë í° ì°šìŽê° ììµëë€. ì ì ì€ë²íë¡ë ë°ëì§íì§ ìì§ë§ ì ì ìëìŽ ììµëë€. ë¶ë ììì ìºì€ížë ì ìëì§ ìì ëìì ëë€.
ë¬Œë¡ ì ëë€.íì§ë§ìŽ ì€ë ëë ëìì ì ìíë ê²ì ëë€. Amanieuê° ììì ì ì©íê² ì°žì¡°í C # ì¬ìììì ê°ìŽ "ëì ì íì ì§ì ëì§ ìì ê°"ì ìì±íë ê²ìŒë¡ ì ì ë ê²œì° ë ìŽì ì ìëì§ ìì ê²ì ëë€ (ìíí ë°©ììŒë¡). ëë²ê·ž ë¹ëìì ì¬ì í íšë ìíê°ëêž° ë묞ì ì€ì íë¡ê·žëšìì ì ì ì€ë²íë¡ì ì ì ì ë í¹ì±ì ìœê² ì¬ì©í ì ììµëë€. ë§ì°¬ê°ì§ë¡, ëŠŽëŠ¬ì€ ë¹ëìì ì íšíì§ ìì ìºì€ížì ìíŽ ìì± ë ê°ì ììž¡ ê°ë¥íê±°ë í¹í ì ì© í íìê° ììµëë€. ëë²ê·ž ë¹ëìì íšëìŽ ë°ìíë©Ž íë¡ê·žëšìŽ ì€ì ë¡ ì¬ì©í ì ìêž° ë묞ì ëë€. ìŽê²ì ì€ì ë¡ ìµì í륌 ìíŽ ì»ŽíìŒë¬ì ìµë ë²ì륌 ì ê³µíë ë°ë©Ž, í¬íì ê°ì ëìì ì ííë©Ž 컎íìŒë¬ê° ì íëê³ ë€ìŽí°ëž í¬í ë³í ëª ë ¹ìŽìë íëìšìŽìì ìë¹í ëë €ì§ ì ììµëë€. (ê·žëŠ¬ê³ ì±ëê° ëª ííê² ì ííì§ ììµëë€.)
ë¹ì ìŽ ì구íë ê²ì ëŠŽëŠ¬ì€ ëªšëìì Vec ê²œê³ ê²ì¬ë¥Œ ëë ê²ê³Œ ì ì¬íì§ë§ ì ìëì§ ìì ëìì íì©íêž° ë묞ì ì못ë ê²ì ëë€. ìì í ìœëìì ì ìëì§ ìì ëìì íì©íë ê²ì íì©ëì§ ììµëë€.
ì ìëì§ ìì 몚ë ëììŽ ëìŒíì§ë ììµëë€. ì ìëì§ ìì ëìì ë¬Žìš ìŒìŽ ìŒìŽëëì§ ê²°ì íë ê²ì 컎íìŒë¬ 구í ììê² ë¬ë € ììì ì믞í©ëë€. float륌 intë¡ ìºì€í íì¬ rustì ìì 볎ì¥ì ìë°í ë°©ë²ìŽìë í, ì¬ëë€ìŽ ììì ë©ëªšëŠ¬ ìì¹ì ìž ì ìëë¡ íì©íë ê²ê³Œ ì ì¬íì§ ìë€ê³ ìê°í©ëë€. ê·žëŒìë ë¶êµ¬íê³ ë¬Œë¡ ëë ê·žê²ìŽ ë°ëì ììž¡ ê°ë¥íì§ë ìëëŒë ìì ì 볎ì¥íë€ë ìë¯žë¡ ì ìëìŽìŒíë€ë ë° ëìí©ëë€.
ì ë§ìžê°ì? ì ìŽë Cì C ++ë ìëì§ë§ Rustì ê°ì Undefined Behavior륌 ê°ì§ê³ ììµëë€ ... C #ì ëíŽ íì íê³ ê°ìžì?
ê·žëŽ ì ìì§. ëë ê·žë€ì 몚ë ì¬ìì ìœì§ ìììµëë€. ë°©êž ë€ìí 컎íìŒë¬ë¥Œ í ì€ížíìµëë€. "ëŽê° ìëí 몚ë 컎íìŒë¬ê° ìŽë° ììŒë¡ ìííë€"ë ë§ì "ìžìŽ ì¬ììŽìŽë¥Œ ìŽë ê² ì ìíë€"ë ë§ê³Œ ë€ë¥Žë€ë ë§ìŽ ë§ìµëë€. ê·žë¬ë ëë ìŽìšë ì€ë²íë¡ë¥Œ ì°¬ì±íë ê²ìŽ ìëëŒ ê·žê²ìŽ ê°ì¥ íí ê² ê°ë€ë ê²ì ì§ì í ë¿ìŽë€. ì ë 1) ì ì ì€ë²íë¡ë¡ë¶í° 볎ížíë ê²ê³Œ ê°ì ìŽì ë¡ 1000000.0ìŽ 65535 ëë 16960ìŽëë ê²ê³Œ ê°ì "ì못ë"결곌ë¡ë¶í° 볎ížíë ë³íì ì°¬ì±íê³ ììµëë€. ë²ê·ž ìŒ ê°ë¥ì±ìŽ ëìŒë¯ë¡ ì¬ì©ìê° ì ííŽìŒí©ëë€. , ë° 2) ëŠŽëŠ¬ì€ ë¹ëìì ìµë ì±ë¥ì íì©í©ëë€.
ì ìëì§ ìì 몚ë ëììŽ ëìŒíì§ë ììµëë€. ì ìëì§ ìì ëìì ë¬Žìš ìŒìŽ ìŒìŽëëì§ ê²°ì íë ê²ì 컎íìŒë¬ 구í ììê² ë¬ë € ììì ì믞í©ëë€. float륌 intë¡ ìºì€í íì¬ rustì ìì 볎ì¥ì ìë°í ë°©ë²ìŽìë í, ì¬ëë€ìŽ ììì ë©ëªšëŠ¬ ìì¹ì ìž ì ìëë¡ íì©íë ê²ê³Œ ì ì¬íì§ ìë€ê³ ìê°í©ëë€. ê·žëŒìë ë¶êµ¬íê³ ë¬Œë¡ ëë ê·žê²ìŽ ì ìëìŽìŒíë€ë ë° ëìí©ëë€ : ì ìëìŽìŒíì§ë§ ë°ëì ììž¡ ê°ë¥í ê²ì ìëëë€.
ì ìëì§ ìì ëìì ìµí° ë§ìŽì (C ë° C ++ì ì€ì ì ë LLVM ê°ë°ìê° ì ê³µ)ê° ë°ìí ì ìë€ê³ ê°ì íê³ ì ìëì§ ìì ìºì€ížë¥Œ íµê³ŒíŽìŒë§ ëë¬ í ììë ìœë ì²í¬ ìì 륌 í¬íšíì¬ íŽë¹ ê°ì ì ë°ëŒ ìœë륌 ë³í í ì ììì ì믞í©ëë€. ëë,ë¡ ìŽ ìì ì 첫 ë²ì§žê° ì ìëì§ ìì ëì ë ê² ížì¶íì§ ìê³ ížì¶ ìœë륌 ížì¶íêž° ë묞ì ìŒ, ì€ì ë¡ ìë ìëëŒë, 곌ì ê° ížì¶ëìŽ ììŽìŒí©ëë€ ê°ì .
ë€ë¥ž ìµì í ëšê³ë¥Œ 구ì±íë ê²ìŽ ìíí ë¹ì ëìì ìì±íì§ ìëë€ë ê²ì ìŠëª íë ê²ìŽ í©ëŠ¬ì ìŽëŒê³ íŽë LLVM ê°ë°ìëìŽë¥Œ 볎졎íêž° ìíŽ ììì ìŒë¡ ë žë ¥íì§ ìì ê²ì ëë€.
ëë 몚ë ì ìëì§ ìì íë ìŽ ê·ž 귌거ìì ë¹ì·íë€ê³ 죌ì¥íê³ ì¶ìµëë€.
ë€ë¥ž ìµì í ëšê³ë¥Œ 구ì±íë ê²ìŽ ìíí ë¹ì ëìì ìì±íì§ ìëë€ë ê²ì ìŠëª íë ê²ìŽ í©ëŠ¬ì ìŽëŒê³ íŽë LLVM ê°ë°ìëìŽë¥Œ 볎졎íêž° ìíŽ ììì ìŒë¡ ë žë ¥íì§ ìì ê²ì ëë€.
êžìì, LLVMìŽ ìŽë° ë°©ììŒë¡ Rustì ëììžì ìí¥ì 믞ì¹ë€ë ê²ì ë¶íí ìŒì ëë€.íì§ë§ ì ë ë°©êž LLVM ëª ë ¹ìŽ ì°žì¡° ì€ ìŒë¶ë¥Œ ìœììŒë©° ììì ìžêž í "ê³ ì "ìì ì ìžêžíìµëë€ ( "... ë ë€ë¥ž ë°©ë²ì LLVMìŽ ê³ ì ì ì¶ê° í ëê¹ì§ êž°ë€ëŠ¬ë ê²ì ëë€. ê°ë ⊠") LLVM ìì€ìì ì ìëì§ ìì ëìì ë°©ì§í©ëë€. ë ¹ìŽ ìŽì ë²ì ì LLVMì ì°ê²°ëìŽ ììµëê¹? ê·žë ì§ ìë€ë©Ž ì°ëŠ¬ë ê·žê²ì ì¬ì©í ì ììµëë€. ê·žë¬ë ì íí ëìì ëí 묞ìë ëª ííì§ ììµëë€.
ìžìê° undef ëë poisonìŽë©Ž 'freeze'ë 'ty'ì íì ììì ê³ ì ê°ì ë°íí©ëë€. ê·žë ì§ ììŒë©ŽìŽ ëª ë ¹ìŽë ìëíì§ ììŒë©° ì ë ¥ ìžì륌 ë°íí©ëë€. ëìŒí 'ê³ ì 'ëª ë ¹ì ìíŽ ë°í ë ê°ì 몚ë ì¬ì©ì íì ëìŒí ê°ì ì€ìíëë¡ ë³Žì¥ëì§ë§ ë€ë¥ž 'ê³ ì 'ëª ë ¹ì ë€ë¥ž ê°ì ìì± í ì ììµëë€.
"ê³ ì ê°"ëë "ëìŒí"ëê²° "ëª ë ¹"ìŽ ë¬Žìì ì믞íëì§ ëªšë¥Žê² ìµëë€. ìŽìì ìŒë¡ë no-opìŒë¡ 컎íìŒíê³ ììž¡í ììë ì ì륌 ì ê³µ í ê²ìŽëŒê³ ìê°íì§ë§ ë¹ì©ìŽ ë§ìŽ ëë ìŒì í ììë ê²ì²ëŒ ë€ëŠœëë€. ìŽ ëê²° ìì ì ìëí ì¬ëìŽ ììµëê¹?
êžì, LLVMìŽ ìŽë° ììŒë¡ ë ¹ì ëììžì ìí¥ì ë¯žì¹ ê²ì ë¶íí ìŒì ëë€.
LLVM ê°ë°ìê° ìµì í íë¡ê·žëšì ìì±íë ê²ì ìëëë€. rustc ê°ë°ìê° ìµí° ë§ìŽì 륌 ìì±íëëŒë ìµí° ë§ìŽì 륌 ì°ê²°íë ìë¡ìŽ ìì±ìŒë¡ ìžíŽ ì ìëì§ ìì ì í¹ì 볞ì§ì ìŒë¡ í° ë°íì ëë€. 묞ì ì ë°ì¬ëŠŒìŽ ìµì í ëšê³ë¥Œ ì°ê²°íì¬ ìì± ë ìë¡ìŽ íë ìŒ ë ìžê°ì ëëë ëšìí "ë°ì¬ëŠŒ ì€ë¥ì ì ì¬ì í¬êž°ë¥Œ ì§ê°"íëë¡ ì§ííì§ ìììµëë€.
ëë ê±°êž°ìì ë¹ì 곌 ëìíì§ ìì ê²ì ëë€. :-)ìŽ LLVM "ê³ ì "ëª ë ¹ìŽìŽ ì ìëì§ ìì ëìì íŒí ììë ì ë¡ ë¹ì© ë°©ë²ì ì ê³µíꞰ륌 ë°ëëë€.
ê·žê²ì ììì ë
ŒìëììŒë©° ê²°ë¡ ì ìºì€í
í ëê²°ìŽ ì ì ë ëììŽì§ë§ ì í í©ëŠ¬ì ìž ëììŽ ìëëŒë ê²ì
ëë€. ëŠŽëŠ¬ì€ ëªšëìì ìŽë¬í ìºì€ížë 겜ê³ë¥Œ ë²ìŽë ì
ë ¥ (ìì í ìì í ìœë)ì ëíŽ ììì 결곌륌 ë°íí©ëë€. ê·žê²ì as
ì²ëŒ ìì§ íŽ ë³ŽìŽë ê²ì ëí ì¢ì ìë¯žê° ìëëë€.
IMOë ê·žë¬í ìë¯žë¡ ì ì°ëŠ¬ê° íŒíê³ ì¶ì ëì ìžìŽ ëììž ìŒ ê²ì ëë€.
ëŽ ì ì¥ì
as
ë ì ë ¥ ë° ì¶ë ¥ ì íì ë°ëŒ í¬ê² ë€ë¥ž ì믞 (ì늌, ì±ë, ë°ì¬ëŠŒ,âŠ)륌 ê°ì§ ì ìêž° ë묞ììŽ ë¬žì ì êŽê³ììŽ ìì í íŒíë ê²ìŽ ê°ì¥ ì¢ìµëë€. ìœë ìœêž°. (íìì¡°ì°šëfoo as _
ìŒë¡ ì¶ë¡ í ì ììµëë€.) ê·žëì ì ëas
ìŽ ì€ëë ìííë 겜ì°ë¥Œ í¬êŽíë ë€ìí ëª ì ì ìŒë¡ ëª ëª ë ë³í ë°©ë²ì ì ìíêž°ìí ì¬ì RFC ìŽìì ê°ì§ê³ ììµëë€. .
ìŽì ëë¬ìŽ! https://internals.rust-lang.org/t/pre-rfc-add-explicitly-named-numeric-conversion-apis/11395
몚ë íŒëë°±ì íìí©ëë€. ê·žë¬ë ì¬êž°ë³Žë€ë ëŽë¶ ì€ë ëì ìë €ì£Œììì€.
ëŠŽëŠ¬ì€ ëªšëìì ìŽë¬í ìºì€ížë 겜ê³ë¥Œ ë²ìŽë ì ë ¥ (ìì í ìì í ìœë)ì ëíŽ ììì 결곌륌 ë°íí©ëë€. ê·žê²ì ìì§í ê²ì²ëŒ 볎ìŽë ê²ì ëí ì¢ì ìë¯žê° ìëëë€.
ë°ë³µíŽì 믞ìíì§ë§ ì ì ì€ë²íë¡ìë ëìŒí 죌ì¥ìŽ ì ì©ëë€ê³ ìê°í©ëë€. ìŒë¶ ì«ì륌 ê³±íê³ ê²°ê³Œê° ì€ë²íë¡ëë©Ž ìííë €ë ê³ì°ìŽ ê±°ì íì€íê² ë¬Žíšíëë ë§€ì° ì못ë 결곌륌 ì»ê²ëì§ë§ ëë²ê·ž ë¹ëìì íšëìŽ ë°ìíì¬ ë²ê·žê° ì¡í ê°ë¥ì±ìŽ ëìµëë€. ì¬ì©ì ìœëì ë²ê·žë¥Œ ëíëŒ ê°ë¥ì±ìŽ ë§€ì° ëêž° ë묞ì ë§€ì° ì못ë 결곌륌 ì ê³µíë ì«ì ë³íë ë¹í©íŽìŒíë€ê³ ë§íê³ ì¶ìµëë€. (ìŒë°ì ìž ë¶ë ììì ë¶ì íì±ì 겜ì°ë ìŽë¯ž ì²ëŠ¬ëìŽ ììµëë€. ê³ì°ìŽ 65535.3ì ìì±íë ê²œì° ìŽë¯žìŽë¥Œ u16ìŒë¡ ë³ííë ê²ìŽ ì íší©ëë€. ë²ì륌 ë²ìŽë ë³íì ì»ìŒë €ë©Ž ìŒë°ì ìŒë¡ ìœëì ë²ê·žê° íìí©ëë€. ë²ê·žë¥Œ ê³ ì¹ ì ìëë¡ ì늌ì ë°ê³ ì¶ìµëë€.)
ëŠŽëŠ¬ì€ ë¹ëê° ì íšíì§ ìì ë³íì ëíŽ ììì ìŽì§ë§ ì ì ë 결곌륌 ì ê³µíë êž°ë¥ì ëí ìµë ì±ë¥ì íì©í©ëë€. ìŽë ì ìê°ì ì«ì ë³í곌 ê°ì Ʞ볞ì ìž ê²ì ëíŽ ì€ìí©ëë€. íì í¬í ìíë ì±ë¥ì ìë¹í ìí¥ì 믞ì¹ê³ ë²ê·žë¥Œ ìšêž°ë©° ìêž°ì¹ ìê² ì¬ë°ë¥ž 결곌륌 ì ê³µíë ê³ì°ì ê±°ìíì§ ììµëë€.
ë°ë³µíŽì 믞ìíì§ë§ ì ì ì€ë²íë¡ìë ëìŒí 죌ì¥ìŽ ì ì©ëë€ê³ ìê°í©ëë€. ìŒë¶ ì«ì륌 ê³±íê³ ê²°ê³Œê° ì€ë²íë¡ëë©Ž ìííë €ë ê³ì°ì ê±°ì íì€íê² ë¬Žíšííë ë§€ì° ì못ë 결곌륌 ì»ê²ë©ëë€.
ì°ëŠ¬ë ê³±ì
ì ëíŽ ë§íë ê²ìŽ ìëëŒ ìºì€ížì ëíŽ ìŽìŒêž°íê³ ììµëë€. ê·žëŠ¬ê³ ì, ì ì ì€ë²íë¡ìë ëìŒíê² ì ì©ë©ëë€. int-to-int ìºì€ížë ì€ë²íë¡íëëŒë íšëìŽ ë°ìíì§ ììµëë€. ìŽë as
, ì€ê³ ì ëë²ê·ž ë¹ëììë íšëìŽ ë°ìíì§ ìêž° ë묞ì
ëë€. ìì íì§ ìì ìœëì ëí ì íì±ê³Œ ìì ì±ì ë¹í©íì§ ìë í¹ì ìì
ì ìì¡Ž í ì ìêž° ë묞ì ë¶ë ììì ìºì€ížë¥Œ ìíŽ ìŽê²ìì ë²ìŽëë ê²ì êž°ê»íŽìŒ ëëê³ ìµì
ì ê²œì° ìíí©ëë€.
as
ì ëììžì ì¬ë°ë¥ž ë³íìŽ íì ê°ë¥íì§ ìì ì íê°ì ì€ë¥ìë ë³íì ì ê³µíêž° ë묞ì ê²°íšìŽ ìë€ê³ 죌ì¥íê³ ì¶ë€ë©Ž ì°ëŠ¬ ëë¶ë¶ìŽ ëì í ê²ìŽëŒê³ ìê°í©ëë€. ê·žë¬ë ìŽê²ì as
castsì êž°ì¡Ž íë ì ìí¬ ëŽìì float-to-int ë³íì ìì íëìŽ ì€ë ëì ë²ì륌 ìì í ë²ìŽë¬ìµëë€. ìŽê²ë€ì ì€ë¥ê° ììŽìŒíê³ ëë²ê·ž ë¹ëììë ë¹í©íŽìë ìë©ëë€. ë°ëŒì í©ëŠ¬ì ìž ( freeze
í¬íšëì§ ìì), float-to-int ìºì€ížì ëí ë¹ íšë ì믞륌 ì ìíê±°ë íšëì íì©íêž° ìíŽ as
ì¬ ì€ê³ì ëí ìë¡ìŽ í ë¡ ì ììíììì€. ìºì€ížê° ìì€ ìŒ ë (ê·žëŠ¬ê³ int-to-int ë° float-to-int ìºì€ížì ëíŽ ìŒêŽëê² ìí)-íìëìŽ ë¬žì ìì 죌ì 륌 ë²ìŽ ë¬ìŒë¯ë¡ ì ì€ë ë (RFC ìŽì ì€íìŒ)륌ì¬ììì€. ê·žì ëí.
UB륌 ìì íêž° ìíŽ ì§êž freeze
ì맚í±ì 구ííë ê²ìŒë¡ ììíë©Ž ìŽëšê¹ì? ê·žëŠ¬ê³ ëì ì°ëŠ¬ê° ì íí 몚ë ì맚í±ìŽ freeze
ì ì íží ë ê²ìŽêž° ë묞ì ì°ëŠ¬ê° ì€ì ë¡ ìíë ì맚í±ì ëíŽ ì ìžê³ìì íì ëì í ì ììµëë€.
UB륌 ìì íêž° ìíŽ
freeze
ìë§ší± _now_륌 구ííë ê²ìŒë¡ ììíë©Ž ìŽëšê¹ì? ê·žë¬ë©Ž ì°ëŠ¬ê° ì íí 몚ë ì맚í±ìŽfreeze
ì ì íží ë ê²ìŽêž° ë묞ì ì°ëŠ¬ê° ì€ì ë¡ ìíë ì맚í±ì ëíŽ ì ìžê³ìì íì ëì í ì ììµëë€.
as
íšëì ìŒìŒí€ì§ ìë ë€ë¥ž ìŽì ê° ììµëë€.ëë ëšì§ as
ìºì€ížë¥Œ ë¹í©íê² ë§ëë ê²ì ë§€ì° ë°ëì§íì§ ìë€ë @RalfJungì ì견ì ëìíì§ë§, @admilazzê° ë§ë ìŽ ì ìŽ ë¶ëª
í ì ííë€ê³ ìê°íì§ ììµëë€.
(ìŒë°ì ìž ë¶ë ììì ë¶ì íì±ì 겜ì°ë ìŽë¯ž ì²ëŠ¬ëìŽ ììµëë€. ê³ì°ìŽ 65535.3ì ìì±íë ê²œì° ìŽë¯žìŽë¥Œ u16ìŒë¡ ë³ííë ê²ìŽ ì íší©ëë€. ë²ì륌 ë²ìŽë ë³íì ì»ìŒë €ë©Ž ìŒë°ì ìŒë¡ ìœëì ë²ê·žê° íìí©ëë€. ë²ê·žë¥Œ ê³ ì¹ ì ìëë¡ ì늌ì ë°ê³ ì¶ìµëë€.)
f32-> u16ì ê²œì° ë°ì¬ëŠŒ ì€ë¥ìì u16 ë²ì륌 ë²ìŽëë €ë©Ž ë§€ì° í° ë°ì¬ëŠŒ ì€ë¥ê° íìíì§ë§ f32ìì 32 ë¹íž ì ìë¡ ë³ííë 겜ì°ìë ê·žë€ì§ ë¶ëª
íì§ ììµëë€. i32::MAX
ë f32ìì ì ííê² ííí ì ììŒë©° ê°ì¥ ê°ê¹ìŽ íí ê°ë¥ ì«ìë i32::MAX
ìì 47 í ìžì
ëë€. ë°ëŒì ìíì ìŒë¡ ìµë i32::MAX
ì ì륌 ì°ì¶íŽìŒíë ê³ì°ìŽìë ê²œì° 0ìì 1 ULP ìŽìì ì€ë¥ê° ë°ìíë©Ž ë²ì륌 ë²ìŽë©ëë€. ê·žëŠ¬ê³ ì ë°ëê° ë®ì ë¶ë ììì (IEEE 754 binary16 ëë ë¹íì€ bfloat16)ì ê³ ë €íë©Ž íšì¬ ë ëë¹ ì§ëë€.
ì°ëŠ¬ë ê³±ì ì ëíŽ ë§íë ê²ìŽ ìëëŒ ìºì€ížì ëíŽ ìŽìŒêž°íê³ ììµëë€.
ì, ë¶ë ììì ìì ì ìë¡ì ë³íì ê³±ì 곌 ê°ì 맥ëœìì ê±°ì ë ì ì ìŒë¡ ì¬ì©ë©ëë€ : ì«ì ê³ì°, ê·žëŠ¬ê³ ì ì ì€ë²íë¡ì ëì곌 ì ì©í ë³ë ¬ìŽ ìë€ê³ ìê°í©ëë€.
ê·žëŠ¬ê³ ì, ì ì ì€ë²íë¡ìë ëìŒíê² ì ì©ë©ëë€. int-to-int ìºì€ížë ì€ë²íë¡ ëëëŒë íšëìŽ ë°ìíì§ ììµëë€. ë¹í©íì§ ìë í¹ì ìì ì ìì¡Ž í ì ììµëë€.
ëë ì¬êž°ììì ë¶ìŒì¹ê° ìŒë°ì ìž êŽíì ìíŽ ì ë¹íëê³ ê·žë ê² ëëì§ ìì ê²ìŽëŒê³ 죌ì¥í©ëë€. ìííž, ë§ì€í¬ ë° ìºì€ížë¥Œ ì¬ì©íì¬ ì ì륌 ìë¥Žê³ ì륎ë ìì -ë¹íž AND íììŒë¡ ìºì€ížë¥Œ íšê³Œì ìŒë¡ ì¬ì©íê³ í¬êž° ë³ê²œì ì¶ê°íë ê²ì ë§€ì° ìŒë°ì ìŽë©° ìì€í íë¡ê·žëë°ìì ì€ë ìì¬ë¥Œ ê°ì§ê³ ììµëë€. ì ìŽë ìŒì£ŒìŒì ì¬ë¬ ë²íë ìŒì ëë€. ê·žë¬ë ì§ë 30 ë ìŽì ëì NaN, Infinity ëë ë²ì륌 ë²ìŽë ë¶ë ììì ê°ì ì ìë¡ ë³ííì¬ í©ëŠ¬ì ìž ê²°ê³Œë¥Œ êž°ëíë ì ìŽ ìììµëë€. (ëŽê° êž°ìµí ììë 몚ë 겜ì°ë ê°ì ìì± í ê³ì°ì ë²ê·žììµëë€.) ë°ëŒì ì ì-> ì ì ìºì€ížì ë¶ë ììì -> ì ì ìºì€ížì 겜ì°ë ëìŒíê² ì²ëŠ¬ëìŽìŒíë€ê³ ìê°íì§ ììµëë€. ìŠ, ìŒë¶ ê²°ì ìŽ ìŽë¯ž ê²°ì ë ê²ì ìŽíŽí ì ììµëë€.
⊠float-to-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ê¹ì§ì ì륌 ì°ì¶íŽìŒíë ê³ì°ìŽìë ê²œì° 0ìì 1 ULP륌 ìŽê³Œíë ì€ë¥ë ë²ì륌 ë²ìŽë©ëë€.
ìŽê²ì ìœê°ì 죌ì ìì ë²ìŽ ë¬ì§ë§ ìíì ìŒë¡ ìµë 2 ^ 31-1ê¹ì§ f32륌 ìì±íŽìŒíë ê°ì ìê³ ëŠ¬ìŠìŽ ìë€ê³ ê°ì íŽ ëŽ ìë€ (íì§ë§ ë°ì¬ëŠŒ ì€ë¥ë¡ ìží 겜ì°ë¥Œ ì ìžíê³ ë 2 ^ 31 ìŽìì ìì±íŽìë ìë©ëë€). ìŽë¯ž ê²°íšìŽìë ê² ê°ìµëë€.
ëë ë¹ì ìŽ ì€ëª íë ê²ì ìííë 몚ë ì€ì©ì ìž ìê³ ëŠ¬ìŠìŽ ìŽë»ê² ë ì ìì ë°ì íê² ì°ê²°ëìŽ ìë€ê³ ìê°í©ëë€. ì륌 ë€ìŽ, ììì i32륌 f32ë¡ ë€ì ë³ííë ê²œì° i32 :: MAX-64 ìŽììŽë©Ž ì€íš í ì ììµëë€. ê·žë¬ë ê·žê²ì ë¹ì ì ì ë°ë륌 ì¬íê² ì íìí€ê³ ì ë¹ì ìŽ ê·žë° ìŒìíëì§ ëªšë¥Žê² ìµëë€. ì 첎 i32 ë²ì륌 ì¶ë ¥íë ê±°ì 몚ë i32-> f32-> i32 ê³ì°ì ì ì ìíìŒë¡ ë ë¹ ë¥Žê³ ì ííê² ííí ì ììµëë€. ê·žë ì§ ììŒë©Ž f64ê° ììµëë€.
ìŽìšë ë²ì륌 ë²ìŽë ë³íì ìííë ìê³ ëŠ¬ìŠìŽ í¬íì ìíŽ ìì ëë 겜ì°ë¥Œ ì°Ÿì ì ìë€ê³ íì íì§ë§ ë묌ë€ê³ ìê°í©ëë€. ë묌Ʞ ë묞ììŽë¥Œ ìì©íêž° ìíŽ _all_ ë³í ìë륌 ëŠì¶ì§ ìììŒí©ëë€. . ê·žëŠ¬ê³ ìŽë¬í ìê³ ëŠ¬ìŠì ì¬ì í ââê²°íšìŽ ììŒë©° ìì íŽìŒíë€ê³ 죌ì¥í©ëë€. ê·žëŠ¬ê³ ìê³ ëŠ¬ìŠì ìì í ììë 겜ì°, ê°ë¥í ë²ì륌 ë²ìŽë ë³í (ëë í¬í ë³í íšì ížì¶) ì ì íì ë²ì ê²ì¬ë¥Œ ìí í ì ììµëë€. ìŽë ê²íë©Ž 결곌륌 ì ííë ë¹ì©ìŽ íìí 겜ì°ìë§ ì§ë¶ë©ëë€.
ì¶ì : 몚ëìê² íë³µí ì¶ì ê°ì¬ì ì ë€ëŠê²íìµëë€.
ë¶ëª í ë§íë©Ž ë구ë ëìíì§ ìëë€ê³ ìê°í©ëë€. ìŽ íëê·žë ëšêž°ê° ë구ë¡ë§ ì ìëììµëë€.
ëë ì£Œë¡ -Zsaturated-float-casts륌 -Zunsaturated-float-castsë¡ ë첎íëŒë ì ìì ìžêžíìµëë€. ì±ëê° êž°ë³žê°ìŽ ëëëŒë -Zunsaturated-float-castsì ê°ì íëê·žë ížíì±ì ì¢ì§ ìì ê²ì²ëŒ 볎ìŽì§ë§ ìŒìì ìž ìëëŒë©Ž êŽì°®ìµëë€. :-)
ìŽìšë , ëë 몚ëê° ëŽê°ìŽ 묞ì ì ëíŽ ì¶©ë¶í ë§íìŒë©Ž ì¢ê² ë€ê³ íì íë€. ì ë Rust íìŽ ì íµì ìŒë¡ ì¬ëë€ìŽ ì±ë¥ê³Œ ìì ì± ì¬ìŽìì ìì ì ì íì í ì ìëë¡ ì¬ë¬ ê°ì§ ë°©ë²ì ì ê³µíë €ê³ ë žë ¥íŽ ììì ìê³ ììµëë€. ì ë ì¬ë¬ë¶ë€ìŽ ê²°êµ ì¢ì íŽê²°ì± ì ëŽëì ê²ìŽëŒë ì êŽì 곌 ì 뢰륌 ê³µì íìµëë€. ì¡°ì¬íŽ!
ëë -Zunsaturated-float-casts
ê° ìŒìì ìŒë¡ ë§ ì¡Žì¬íê³ ìžì ê°ë ì ê±° ë ê²ìŽëŒê³ ê°ì íìµëë€. ì ìŽë -C
ìëëŒ -Z
ìµì
(Nightlyììë§ ì¬ì© ê°ë¥)ìŽëŒë ì ìŽ ì ìí©ëë€.
ê°ì¹ê°ìë ê²œì° ì±ëì UBë§ìŽ ì ìŒí ì íì ìëëë€. ë ë€ë¥ž ê°ë¥ì±ì CPUì Ʞ볞 ì€ë²íë¡ ëìì ì¬ì©íë fptosi
ì ë³íì ì¶ê°íëë¡ LLVMì ë³ê²œíë ê²ì
ëë€. ìŠ, ì€ë²íë¡ ëìì ìí€í
ì²ê°ì ìŽì í ì ìì§ë§ 죌ìŽì§ ìí€í
ì²ìì ì ì ìë©ëë€ ( ì륌 ë€ìŽ x86ìì 0x80000000 ë°í), ì ëë¡ í¬ìŽìŠìŽë ìŽêž°íëì§ ìì ë©ëªšëŠ¬ë¥Œ ë°ííì§ ììµëë€. Ʞ볞ê°ìŽ í¬í ìíê° ëëëŒë ìµì
ìŒë¡ ì¬ì©íë©Ž ì¢ì ê²ì
ëë€. ê²°êµ í¬í ìºì€ížë Ʞ볞 ëììŽ ìë ìí€í
ì²ì ëŽì¬ ë ì€ë² í€ëê°ìë ë°ë©Ž, "CPUê°íë ìì
ìí"ì í¹ì 컎íìŒë¬ ìµì í륌 êžì§íë 겜ì°ìë§ ì€ë² í€ëê° ììµëë€. íì€íì§ë ìì§ë§ float-to-int ì€ë²íë¡ë¥Œ UBë¡ ì²ëŠ¬íì¬ íì±í ë ìµì íë íì ìì¥ìŽë©° ëë¶ë¶ì ìœëì ì ì© í ì ìë€ê³ ìê°í©ëë€.
ìŠ, ìí€í
ì²ì ì€ë²íë¡ì ë€ë¥ž ê°ì ë°ííë ì¬ë¬ float-to-int ëª
ë ¹ìŽê°ìë ê²œì° ë¬žì ê° ë ì ììµëë€. ìŽ ê²œì° íë ëë ë€ë¥ž íë륌 ì ííë 컎íìŒë¬ë êŽì°° ê°ë¥í ëìì ìí¥ì 믞ì¹ë©°, ìŽë ê·ž ì첎ë¡ë 묞ì ê°ëì§ ìì§ë§ ëšìŒ fptosi
ê° ë³µì ëê³ ë ë³µì¬ë³žìŽ ë€ë¥Žê² ëìíë ê²œì° íëê° ë ì ììµëë€. ê·žë¬ë ìŽë¬í ì¢
ë¥ì ì°šìŽê° ì€ì ë¡ ìžêž°ìë ìí€í
ì²ì ì¡Žì¬íëì§ íì€íì§ ììµëë€. ë¶ë ììì ì¶ì륌 í¬íší ë€ë¥ž ë¶ë ììì ìµì íìë ëìŒí 묞ì ê° ì ì©ë©ëë€.
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
ë©ìë 륌 ì¬ì©íì¬ ë³íì ìíí©ëë€. ê·žë¬ë ìŽê²ìŽ ìì ì ìž ë³ŽìŠìžì§ íì€íì§ ììµëë€. í¹í ìŽì ì ë³ê²œë ê²ì²ëŒ 볎ììµëë€ (믞늬ìì íŽë¹ í목ì 구íí ë ìì§ ëª»íš).
ëë ìŽê²ì ìŽë€ ìœë ì ìŽ ì ííë ê°ì ì¡°ì í ì ìë€ê³ ìê°íë€. ê·žë¬ë LLVMì apfloat (Rust ë²ì ìŽ ì§ì í¬íž ì)ê° ì±ë륌 ì¬ì©íë€ë ì¬ì€ì ìŽê²ìŽ ìŒì¢ ì "í©ëŠ¬ì ìž êž°ë³žê°"ìŽëŒë ì¢ì ì§íì ëë€.
êŽì°° ê°ë¥í ëìì ëí í ê°ì§ íŽê²°ì±
ì 컎íìŒë¬ ëë 결곌 ë°ìŽë늬륌 ë¹ë í ë ì¬ì© ê°ë¥í ë©ìë ì€ íë륌 묎ììë¡ ì ííë ê²ì
ëë€.
ê·žë° ë€ì í¹ì ëììŽ íìí ì¬ì©ì륌 ìíŽ a.saturating_cast::<i32>()
ì ê°ì êž°ë¥ì ì¬ì©í©ëë€.
ë¿¡ë¿¡
"묎ìì"ëŒë ëšìŽë ì¬í ê°ë¥í ë¹ë륌 ì»ìŒë €ë ë žë ¥ì ë°íì¬ ì€íëë©° 컎íìŒë¬ ë²ì ëŽìì ììž¡í ììë ê²œì° ëêµ°ê° ë³ê²œëì§ ìë ê²ì ìì¡Žíë€ê³ ê²°ì í
@comexê° ì€ëª í IMO (ìŽ ì€ë ë IIRCì ìë¡ìŽ ê²ìŽ ìëë©° ì€ëë 몚ë ê²ìŽ ë€ì ì ê²ì ëë€) ì±ë륌 ìíì§ ìë ê²œì° ì°šì ì± ì ëë€. ìŽë¥Œ í ì€ížíêž° ìíŽ LLVM ë³ê²œìŽ íìíì§ ììµëë€. ìžëŒìž asmì ì¬ì©í ì ììµëë€ (ìŽë¬í ì§ì¹šìŽìë ìí€í ì²ìì).
ìŠ, ìí€í ì²ì ì€ë²íë¡ì ë€ë¥ž ê°ì ë°ííë ì¬ë¬ float-to-int ëª ë ¹ìŽê°ìë ê²œì° ë¬žì ê° ë ì ììµëë€. ìŽ ê²œì° íë ëë ë€ë¥ž íë륌 ì ííë 컎íìŒë¬ë êŽì°° ê°ë¥í ëìì ìí¥ì 믞ì¹ë©°, ìŽë ê·ž ì첎ë¡ë 묞ì ê°ëì§ ìì§ë§ ëšìŒ
fptosi
ê° ë³µì ëê³ ë ë³µì¬ë³žìŽ ë€ë¥Žê² ëìíë ê²œì° íëê° ë ì ììµëë€.
IMO ìŽë¬í ë¹ê²°ì ë¡ ì freeze
ë¹íŽ ê±°ì 몚ë ì€ì§ì ìž ìŽì ì í¬êž°í ê²ì
ëë€. ìŽë ê²íë€ë©Ž, ì°ëŠ¬ë ìí€í
ì² ë¹ íëì ëª
ë ¹ìŽë¥Œ ì ííê³ ê·žê²ì 충ì€íŽìŒí©ëë€. ë ê°ì§ 몚ë ê²°ì ì±ì ìíŽ ê·žëŠ¬ê³ íë¡ê·žëšìŽ ì€ì ë¡ ì믞ê°ìì ë ëª
ë ¹ìŽì ëìì ìì¡Ž í ì ìëë¡íŽìŒí©ëë€. ìŒë¶ ìí€í
ì²ìì ìŽê²ìŽ ê°ë¥íì§ ìë€ë©Ž ìíížìšìŽ 구íìŒë¡ ëìê° ì ììµëë€ (íì§ë§ ìŽê²ì ì ì ìŒë¡ ê°ì€ì ìž ê²ì
ëë€).
ìŽ ê²°ì ì LLVMì ììíì§ ìê³ ëì ìžëŒìž asmì ì¬ì©íì¬ ìì ì 구ííë ê²ìŽ ê°ì¥ ìœìµëë€. ë¶ìì ìŒë¡ LLVMì ë³ê²œíì¬ ìë¡ìŽ ëŽì¥ íšì륌 ì¶ê°íê³ ëªšë ë°±ìëìì ë®ì¶ë ê²ë³Žë€ íšì¬ ìœìµëë€.
ë¿¡ë¿¡
[...] ë¶ìì ìŒë¡ 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
ì°ì°ìë ìŽë¬í ê²œì° ë©ëªšëŠ¬ìì ìŒë¶ ì°ë Ʞ륌 ê°ì ž ì€ë ê² ê°ìµëë€.
"float as int"ì ëíŽ as
ì¬ì©ì ìì í êžì§íê³ ëì í¹ì ë°ì¬ëŠŒ ë°©ë²ì ìì¡Žíë ê²ìŽ ì¢ìµëë€. ì¶ë¡ : as
ë ë€ë¥ž ì íì ëíŽ ìì€ìŽ ììµëë€.
ì¶ë¡ : ë€ë¥ž ì íì ê²œì° ìì€ìŽ ììµëë€.
ë§ëì?
Rust Bookì êž°ë°ìŒë¡ ì ë í¹ì ê²œì° (ìŠ, From<X>
ê° ì í Yì ëíŽ ì ì ë 겜ì°)ììë§ ë¬Žìì€ìŽëŒê³ ê°ì í ì ììµëë€. ìŠ, u8
륌 u32
ìºì€íž í ì ììµëë€ From
륌 ì¬ì©íì§ë§ ê·ž ë°ëë ìëëë€.
"ìì€ìŽ ìë"ì ì í© í ë§íŒ ìì ê°ì ìºì€í
íë ê²ì ì믞í©ëë€. ì : 1_u64 as u8
ë ìì€ìŽ ììŒë¯ë¡ u8 as u64 as u8
ì ìì€ìŽ ììµëë€. floatì ê²œì° 20000000000000000000000000000_u128 as f32
ë ìì€ìŽìë ë°ë©Ž 20000001_u32 as f32
ë ìì€ìŽ ììŒë¯ë¡ "fits"ì ëí ê°ëší ì ìê° ììŒë¯ë¡ float as int
ë int as float
ë ìì€ìŽ ììµëë€.
256u64 as u8
ë ìì€ìŽ ììµëë€.
ê·žë¬ë <anything>_u8 as u64 as u8
ë ê·žë ì§ ììµëë€.
ìì€ì ì ììŽë©° ìºì€ížìì ììëë ê²ìŽì§ 묞ì ê° ìëëŒê³ ìê°í©ëë€. ìºì€íž (ì : u32 as u8
)륌 ì¬ì©íì¬ ì ì륌 ì륎ë ê²ì ì ê° ìê³ ìë 몚ë Cì ì ì¬í ìžìŽìì ìŒêŽë ì ìŽíŽ ë ì믞륌 ê°ì§ ìŒë°ì ìž ìì
ì
ëë€ (ì ìŽë 2ì 볎ì ì ì ííì ì¬ì©íë ìí€í
ì²ììë Ʞ볞ì ìŒë¡ ììŠ ëªšë). ì íší ë¶ë ììì ë³í (ìŠ, ì ì ë¶ë¶ìŽ ëìì ë§ë ìì¹)ë ì ìŽíŽëê³ í©ì ë ì믞 첎ê³ë¥Œ ê°ìµëë€. 1.6 as u32
ë ìì€ìŽ ìì§ë§ ê²°ê³Œê° 1ìŽìŽìŒíë€ë ë° ëìíë 몚ë Cì ì ì¬í ìžìŽì
ëë€.ìŽ ë ê²œì° ëªšë ìŽë¬í ë³íìŽ ìëíŽìŒíë ë°©ì곌 Cì ê·ì¹ì ëí íëìšìŽ ì ì¡°ì
첎 ê°ì í©ììì ë²ìŽë©ëë€. -ìºì€ížíë ìžìŽë ê³ ì±ë¥ìŽìŽìŒí©ëë€. "ëŽê°íë ìŒì ìê³ ììµëë€"ì¢
ë¥ì ì°ì°ì.
ë°ëŒì ì íšíì§ ìì ë¶ë ììì ë³í곌 ê°ì ë°©ììŒë¡ 묞ì 륌 ê³ ë €íŽìë ìëë€ê³ ìê°í©ëë€. Cì ì ì¬í ìžìŽ ë íëìšìŽìì í©ì ë ìë¯žê° ìêž° ë묞ì ëë€ (íì§ë§ ìŒë°ì ìŒë¡ ì€ë¥ ìíê° ë°ìí©ëë€). ëë íëìšìŽ ììž) ê±°ì íì ë²ê·ž (ëŽ ê²œíì)륌 ëíëŽë¯ë¡ ìŒë°ì ìŒë¡ ì¬ë°ë¥ž ìœëì ì¡Žì¬íì§ ììµëë€.
ìŽ ë¬žì ê° ë°ìíì¬ ë€ì 컎íìŒíì§ ììë ì€íê°ì ì¬í í ììë ê²°ê³Œê° ìì±ëììµëë€.
as
ì°ì°ìë ìŽë¬í ê²œì° ë©ëªšëŠ¬ìì ìŒë¶ ì°ë Ʞ륌 ê°ì ž ì€ë ê² ê°ìµëë€.
ê°ìžì ìŒë¡ ëë ë³íìŽ ì íšíì§ ìì ëë§ ë°ìíê³ ê°ë¹ì§ ê°ì ìì±íë ê² ìžì ë¶ìì©ìŽìë í êŽì°®ë€ê³ ìê°í©ëë€. ìœë ì¡°ê°ìì ì íšíì§ ìì ë³íìŽ ì ë§ë¡ íìíë€ë©Ž, ê·žê²ìŽ ê°ì žìŒíë€ê³ ìê°íë ìë¯žë¡ ìŒë¡ ì íšíì§ ìì ìŒìŽì€ë¥Œ ì§ì ì²ëŠ¬ í ì ââììµëë€.
ì°ë êž° ê°ì ìì±íë ê² ìžì ë¶ìì©ìŽ ììµëë€.
ë¶ìì©ì ê°ë¹ì§ ê°ìŽ ë©ëªšëŠ¬ ìŽëê°ìì ë°ìíê³ ìŒë¶ (ìë§ë 믌ê°í) ë°ìŽí°ë¥Œ ëë¬ëžë€ë ê²ì ëë€. float ì첎ììë§ ê³ì° ë "묎ìì"ê°ì ë°ííë ê²ì êŽì°®ì§ ë§ íì¬ ëìì ê·žë ì§ ììµëë€.
ì íší ë¶ë ììì ë³í (ìŠ, ì ì ë¶ë¶ìŽ ëìì ë§ë ìì¹)ë ì ìŽíŽëê³ í©ì ë ì믞 첎ê³ë¥Œ ê°ìµëë€.
ëª
ì ì trunc()
, round()
, floor()
ëë ceil()
ëë°íì§ ìë float-int ë³íì ì¬ì© ì¬ë¡ê° ììµëê¹? as
ì íì¬ ë°ì¬ëŠŒ ì ëµì "ì ìëì§ ìì"ìŽë¯ë¡ as
ë°ì¬ëŠŒëì§ ìì ì«ìì ê±°ì ì¬ì©í ì ììµëë€. ëë ëë¶ë¶ì ê²œì° x as u32
륌 ì°ë ì¬ëìŽ ì€ì ë¡ x.round() as u32
ìíë€ê³ ìê°í©ëë€.
ìì€ì ì ììŽë©° ìºì€ížìì ììëë ê²ìŽì§ 묞ì ê° ìëëŒê³ ìê°í©ëë€.
ëìíì§ë§ ìì€ì ìœê² ììž¡í ììë 겜ì°ìë§ ê°ë¥í©ëë€. ì ìì ê²œì° ìì€ ë³í ì¡°ê±ŽìŽ ë¶ëª í©ëë€. ìë ì ê²œì° ëªšíží©ëë€. ë§€ì° í° ì«ìì ëíŽìë 묎ìì€ìŽì§ë§ ë¥ê·Œ 겜ì°ìë ìŒë¶ ìì ì«ììë ìì€ìŽ ììµëë€. ê°ìžì ìŒë¡ ì€ìë¡ ìì€ ë³íì ëì íì§ ìêž° ìíŽ ìì€ ë° ë¬Žìì€ ë³íì ëíŽ ë ê°ì ë€ë¥ž ì°ì°ì륌 ì¬ì©íë ê²ìŽ ì¢ì§ë§ ìì€ ì¬ë¶ë¥Œ ì ì ìë€ë©Ž í ëª ì ì°ì°ìë§ìŒë¡ë êŽì°®ìµëë€.
ë¶ìì©ì ê°ë¹ì§ ê°ìŽ ë©ëªšëŠ¬ ìŽëê°ìì ë°ìíê³ ìŒë¶ (ìë§ë 믌ê°í) ë°ìŽí°ë¥Œ ëë¬ëžë€ë ê²ì ëë€.
ëë ê·žê²ìŽ 목ì ì§ë¥Œ ë³ê²œíì§ ìê³ ê·žëë¡ëꞰ륌 êž°ëíì§ë§ ê·žê²ìŽ ì ë§ë¡ 묞ì ëŒë©Ž 뚌ì ì ë¡í ë ì ììµëë€.
ëª ì ì trunc (), round (), floor () ëë ceil ()ì ëë°íì§ ìë float-int ë³íì ì¬ì© ì¬ë¡ê° ììµëê¹?
as
ì íì¬ ë°ì¬ëŠŒ ì ëµì "ì ìëì§ ìì"ìŽë¯ë¡ ë°ì¬ëŠŒëì§ ìì ì«ìì ê±°ì ì¬ì©í ì ììµëë€.
ë°ì¬ëŠŒ ì ëµìŽ ì ë§ë¡ ì ìëì§ ììë€ë©Ž ê·žê²ì ëìê² ëëŒìŽ ìŒìŽë©°, ìŽë¯ž ì ì륌 ì ê³µíì§ ìë í ì°ì°ìê° ê±°ì ì ì©íì§ ìë€ë ë° ëìí©ëë€. 0ìŒë¡ ì늎 ê²ìŒë¡ ììí©ëë€.
ëë ëë¶ë¶ì 겜ì°
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
floatìì ì ìë¡ ìºì€í íë©Ž floatê° 0ìŒë¡ ë°ì¬ëŠŒë©ëë€.
ì°žê³ : íì¬ ë°ì¬ëŠŒ ë ê°ì ëì ì ì ì íìŒë¡ ëíëŒ ììë ê²œì° ì ìëì§ ìì ëììŽ ë°ìí©ëë€. ì¬êž°ìë Inf ë° NaNìŽ í¬íšë©ëë€. ìŽê²ì ë²ê·žìŽë©° ìì ë ê²ì ëë€.
ë©ëªšë ì¬êž°ì ë§í¬ë©ëë€.
"ì í©í"ê°ì ë°ì¬ëŠŒì ì ì ìëìŽ ììŒë©°ìŽ 묞ì ì ëí ëŽì©ìŽ ìëëë€. ìŽ ì€ë ëë ìŽë¯ž êžžêž° ë묞ì ìŽë¯ž í늜ëê³ ë¬žìí ë ì¬ì€ì ëí íì ížë¥Œ ì¶ìž¡íì§ ìë ê²ìŽ ì¢ìµëë€. ê°ì¬.
ê²°ì íŽìŒ í ì¬íì ë€ì곌 ê°ì ê²œì° f as $Int
륌 ì ìíë ë°©ë²ì
ëë€.
f.trunc() > $Int::MAX
(ìì 묎íë í¬íš)f.trunc() < $Int::MIN
(ìì 묎íë í¬íš)f.is_nan()
-Z saturating-casts
컎íìŒë¬ íë귞륌 ì¬ì©íì¬ Nightlyìì ìŽë¯ž 구íëê³ ì¬ì© ê°ë¥í í ê°ì§ ìµì
ì ê°ê° $Int::MAX
, $Int::MIN
ë° 0ì ë°ííëë¡ ì ìíë ê²ì
ëë€. ê·žë¬ë ì¬ì í ë€ë¥ž íëì ì íí ì ììµëë€.
ëŽ ê²¬íŽë íëìŽ íì€í ê²°ì ì ìŽìŽìŒíê³ (ì륌 ë€ìŽ ë¹í©íì§ ìê³ ) ì ì ê°ì ë°ííŽìŒíì§ë§ ì íí ê°ì ê·žë€ì§ ì€ìíì§ ììŒë©° ìŽë¬í 겜ì°ì êŽì¬ìŽìë ì¬ì©ìë ë³ëë¡ ì ìíë ë³í ë°©ë²ì ì¬ì©íŽìŒí©ëë€. ì¶ê° : https://internals.rust-lang.org/t/pre-rfc-add-explicitly-named-numeric-conversion-apis/11395
ëë ê·žê²ìŽ ëë©ìžì ë¬ë € ìë€ê³ ìê°íì§ë§
x.trunc() as u32
ë ꜀ ìŒë°ì ìŒë¡ ë°ëì§íë€ê³ ìê°í©ëë€.
ì³ì. ìŒë°ì ìŒë¡ x.anything() as u32
, ëë¶ë¶ round()
ìŽì§ë§ trunc()
, floor()
, ceil()
ììµëë€. 구첎ì ìž ë°ì¬ëŠŒ ì 찚륌 ì§ì íì§ ìê³ x as u32
ë§íë©Ž ì€ì ìŒ ê°ë¥ì±ìŽ íœëë€.
ëŽ ê²¬íŽë íëìŽ íì€í ê²°ì ì ìŽìŽìŒíë©° (ì륌 ë€ìŽ ë¹í©íì§ ìê³ ) ì ì ê°ì ë°ííŽìŒíì§ë§ ì íí ê°ì ë묎 ì€ìíì§ ììµëë€.
ê°ìžì ìŒë¡ "ì ìëì§ ìì"ê°ì ì¬ì©íŽë êŽì°®ìµëë€. ëš ë¶ë ì ìì ìë§ ìì¡Žíì§ ìê³ ê°ì¥ ì€ìí ê²ì êŽë šìë ë ì§ì€í° ë° ë©ëªšëŠ¬ ëŽì©ì ë žì¶íì§ ìë 겜ì°ì ëë€.
-Z saturating-casts
컎íìŒë¬ íë귞륌 ì¬ì©íì¬ Nightlyìì ìŽë¯ž 구íëê³ ì¬ì© ê°ë¥í í ê°ì§ ìµì ì ê°ê°$Int::MAX
,$Int::MIN
ë° 0ì ë°ííëë¡ ì ìíë ê²ì ëë€. ê·žë¬ë ì¬ì í ë€ë¥ž íëì ì íí ì ììµëë€.
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 ì ë°ìŽíž
_sat
í
ì€ížë í
ì€ížëë ê°ì ìž¡ë©Žìì ë€ë¥žê°ì? (ížì§ : ê°ìŽ ëìŒíë€ë ìê²¬ìŽ ììµëë€.) Rustì í¬í í ìºì€ížì ê²œì° ìŽë¬í ê° ì€ ë§ì ê²ì ê°ì žì https://github.com/rust-lang/miri/pull/1321ì ì¶ê°íìµëë€
UB intrinsicì ê²œì° wasm ìž¡ì ížë©ìŽ Miriìì 컎íìŒ ì€íš í ì€ížê°ëìŽìŒíë€ê³ ìê°í©ëë€.
ì
ë ¥ ê°ì 몚ë ëìŒíì§ë§ _sat
ì°ì°ìë íž ë©í ì°ì°ìê° ììëë ížë©ì ê°ì§ê³ ìë ì
ë ¥ìì ìì ì¶ë ¥ ê°ì ê°ëë€ë ì ë§ ë€ëŠ
ëë€.
https://github.com/rust-lang/miri/pull/1321 ì Miri (ë° Rust CTFE ìì§)ì ëí í
ì€ížê° ì¶ê°ëììµëë€ 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ì í¬í -Z íëê·žì ëìì ìì ííêž° ìíŽ ìŽëí©ëë€.
ìŽ ì€ë ëì êžžìŽë¥Œ ê°ìí ë ì¬ëë€ìŽ ê·ž ëêžìì ëŽê° ëì¹ ê²ìŽ ìë€ê³ ëëŒë©Ž PRì íŽì€ì ì§ìíê±°ë ì¬ìí ê²œì° Zulip ëë Discord (ì뮬 ëŒ í¬ëŒ)ì ëíŽ ìì ë¡ê² í (ping) í ì ììµëë€. PR ì€ë ëìì ë¶íìí ììì íŒíêž° ìíŽ ë¬žì 륌 íŽê²°íììì€.
ìžìŽ íì ëêµ°ê°ê° 곧 íŽë¹ PRì ëí FCP ì ìì ììí ê²ìŒë¡ ììíê³ ë³í©íë©ŽìŽ ë¬žì ê° ìëìŒë¡ ì¢ ë£ë©ëë€. :)
íìž ë ì íì ëí ê³íìŽ ììµëê¹? fn i32::checked_from(f64) -> Result<i32, DoesntFit>
?
i32::checked_from(4.5)
ë°ííŽìŒíëì§ ê³ ë €íŽìŒí©ëë€.
ê°ì¥ ì ì©í ëêž
LLVMìì float륌 int ìºì€ížë¡ í¬íìí€êž°ìí ëŽì¥ íšì륌 구ííêž°ìí ìì ì ììíìµëë€. https://reviews.llvm.org/D54749
ê·žê²ìŽ ìŽëë¡ ë ê°ë©Ž í¬í ì믞륌 ì»ë ë¹êµì ë®ì ì€ë² í€ë ë°©ë²ì ì ê³µí©ëë€.