Design: NaN λΉ„νŠΈκ°€ μ™„μ „νžˆ 결정적이지 μ•Šμ€ 이유 λ¬Έμ„œν™”

에 λ§Œλ“  2016λ…„ 03μ›” 22일  Β·  15μ½”λ©˜νŠΈ  Β·  좜처: WebAssembly/design

(ν˜„μž¬ μ˜Ήν˜Έν•˜λŠ” 것이 μ•„λ‹™λ‹ˆλ‹€. μ΄λŠ” 정보에 μž…κ°ν•œ 결정을 내리고 κ·Όκ±°λ₯Ό μœ„ν•œ 자료λ₯Ό μˆ˜μ§‘ν•˜κΈ° μœ„ν•œ κ²ƒμž…λ‹ˆλ‹€.)

Nondeterminism.md λ₯Ό 보면 NaN λΉ„νŠΈ 뢀뢄이 λˆˆμ— λ•λ‹ˆλ‹€. λ¬Όλ‘  μŠ€λ ˆλ“œκ°€ κ²½μŸν•  수 있고 λ¦¬μ†ŒμŠ€κ°€ 고갈될 수 있으며 κΈ°λŠ₯이 좔가될 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 전체 λ””μžμΈμ˜ κ²°κ³Όμž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ NaN λΉ„νŠΈ? VM이 μ’€ 더 μ˜λ¦¬ν•˜κ³  이λ₯Ό μ²˜λ¦¬ν•  수 μžˆμ„κΉŒμš”? 두 가지 λ¬Έμ œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

μž‘μ—…μ— λ‘˜ μ΄μƒμ˜ NaN ν”Όμ—°μ‚°μžκ°€ 있으면 μ–΄λ–€ 것이 μ „νŒŒλ©λ‹ˆκΉŒ?

IEEE 754λŠ” 이것을 μ§€μ •ν•˜μ§€ μ•Šμ€ μ±„λ‘œ λ‘μ§€λ§Œ μ΅œμ†Œν•œ x86, ARM 및 PowerλŠ” λͺ¨λ‘ "첫 번째" ν”Όμ—°μ‚°μžλ₯Ό μ„ νƒν•˜κ³  합리적인 μ„ νƒμž…λ‹ˆλ‹€.

κ·ΈλŸ¬λ‚˜ wasm μˆ˜μ€€μ—μ„œ 선택 사항을 μˆ˜μ •ν•˜λ©΄ wasm κ΅¬ν˜„μ΄ 뢀동 μ†Œμˆ˜μ  λ§μ…ˆ 및 κ³±μ…ˆμ„ 톡근할 수 μ—†μŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€. μ΄λŠ” λͺ…λ Ήμ–΄κ°€ μž…λ ₯ 쀑 ν•˜λ‚˜λ₯Ό λ°©ν•΄ν•˜λŠ” pre-VEX x86μ—μ„œ μœ μš©ν•œ μ΅œμ ν™”μž…λ‹ˆλ‹€. λ˜ν•œ LLVM 기반 VM을 μ‚¬μš©ν•˜λŠ” μ‚¬λžŒμ€ λˆ„κ΅¬λ‚˜ wasmμ—μ„œ λ”ν•˜κΈ°μ™€ κ³±ν•˜κΈ°κ°€ κ°€ν™˜μ„±μ΄ μ—†λ‹€λŠ” 것을 κ°€λ₯΄μ³μ•Ό ν•©λ‹ˆλ‹€.

λˆ„κ΅°κ°€λŠ” 이것이 μ‡Ό μŠ€ν† νΌκ°€ μ•„λ‹ˆλΌκ³  ν•©λ¦¬μ μœΌλ‘œ μ£Όμž₯ν•  수 μžˆμœΌλ―€λ‘œ 이 λ¬Έμ œλŠ” κ°•ν•œ μš•κ΅¬κ°€ 있으면 이둠적으둜 κ³ μΉ  수 μžˆμŠ΅λ‹ˆλ‹€.

연산이 NaN을 μƒμ„±ν•˜κ³  NaN ν”Όμ—°μ‚°μžκ°€ μ—†λŠ” 경우 λΆ€ν˜Έ λΉ„νŠΈλŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

x86은 1을 μ‚¬μš©ν•˜κ³  ARM은 0을 μ‚¬μš©ν•©λ‹ˆλ‹€.

이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” κ°€μž₯ κ°„λ‹¨ν•œ 방법은 λͺ¨λ“  뢀동 μ†Œμˆ˜μ  μ—°μ‚° 후에 μ •κ·œν™”ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 이것은 μˆ˜ν–‰ν•  수 μžˆμ§€λ§Œ μ „νŒŒν•  NaN ν”Όμ—°μ‚°μžκ°€ μžˆμ„ λ•Œ 0κ³Ό 1이 λͺ¨λ‘ μœ νš¨ν•œ 값일 수 μžˆμœΌλ―€λ‘œ NaN κ²°κ³Όλ₯Ό ν™•μΈν•˜κ³  μ •κ·œν™”ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œλŠ” μΆ©λΆ„ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. NaN 결과와 NaN ν”Όμ—°μ‚°μžκ°€ μ—†λŠ”μ§€ ν™•μΈν•œ λ‹€μŒ μ •κ·œν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€.

_λͺ¨λ“ _ μž‘μ—… 후에 μ •κ·œν™”ν•˜λŠ” 것은 맀우 λΉ„μš©μ΄ 많이 λ“­λ‹ˆλ‹€. 또 λ‹€λ₯Έ μ˜΅μ…˜μ€ κ³„μ‚°μ˜ "μ΄μŠ€μΌ€μ΄ν”„" μ§€μ μ—μ„œ μ •κ·œν™”ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€(μ •κ·œν™” κ²½λ‘œλŠ” 기본적으둜 μ˜¬λ°”λ₯Έ NaN 좜λ ₯을 κ²°μ •ν•˜κΈ° μœ„ν•΄ 전체 계산 μŠ€νŠΈλ¦Όμ„ μž¬μƒν•΄μ•Ό 함). 이것은 κ°œμ„  μ‚¬ν•­μ΄μ§€λ§Œ μ—¬μ „νžˆ μƒλ‹Ήν•œ μ˜€λ²„ν—€λ“œλ₯Ό μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

또 λ‹€λ₯Έ κ°€λŠ₯ν•œ κ΅¬ν˜„μ€ 잘λͺ»λœ μ˜ˆμ™Έμ˜ 마슀크λ₯Ό ν•΄μ œν•˜κ³  NaN이 생성될 λ•Œλ§ˆλ‹€ νŠΈλž©μ„ μˆ˜ν–‰ν•œ λ‹€μŒ μ •κ·œν™” 및 λ°˜ν™˜μ„ μˆ˜ν–‰ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 단점은 기본이 μ•„λ‹Œ CPU λͺ¨λ“œλ₯Ό μ‚¬μš©ν•˜κ³  μœ νš¨ν•˜μ§€ μ•Šμ€ ν•­λͺ©μ΄ 많이 μƒμ„±λ˜λŠ” 경우 맀우 λŠλ¦½λ‹ˆλ‹€.

λΆˆν–‰νžˆλ„ μ΄λŸ¬ν•œ μ ‘κ·Ό λ°©μ‹μ—λŠ” μ‹¬κ°ν•œ 단점이 μžˆμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ 아이디어가 λ– μ˜€λ₯΄μ§€ μ•Šκ±°λ‚˜ 맀우 κ°•ν•œ μš•κ΅¬κ°€ μ—†μœΌλ©΄ ν•΄κ²°ν•˜κΈ° μ–΄λ €μšΈ 것 κ°™μŠ΅λ‹ˆλ‹€.


μ£Όλͺ©ν•΄μ•Ό ν•  또 λ‹€λ₯Έ 사항은 NaN λΉ„νŠΈλŠ” μ‹€μˆ˜λ‘œ κ΄€μ°°ν•˜κΈ° μ–΄λ ΅κΈ° λ•Œλ¬Έμ— 일반적으둜 μ£Όμš” 이식성 λ¬Έμ œκ°€ μ•„λ‹ˆλΌλŠ” κ²ƒμž…λ‹ˆλ‹€.

λ‹€λ₯Έ μ‚¬λžŒμ΄ μΆ”κ°€ν•  생각이 μžˆμŠ΅λ‹ˆκΉŒ?

clarification floating point

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

결정을 내리기 전에 μ΄κ²ƒμ˜ μ„±λŠ₯ 효과λ₯Ό μ •λŸ‰ν™”ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 우리의 툴체인이 ν˜„μž¬λ‘œμ„œλŠ” 쒋은 μ„±λŠ₯ 츑정을 ν•˜κΈ°μ—λŠ” 아직 λ―Έμ„±μˆ™ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. λ‹€λ₯Έ 말둜 ν•˜μžλ©΄, λ‚˜λŠ” "μ²œμžκ΅­μ— μ˜ν•œ 죽음"을 ν”Όν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

λͺ¨λ“  15 λŒ“κΈ€

μ£Όλͺ©ν•΄μ•Ό ν•  또 λ‹€λ₯Έ 사항은 NaN λΉ„νŠΈκ°€ μ‹€μˆ˜λ‘œ κ΄€μ°°ν•˜κΈ° μ–΄λ ΅λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

그것듀을 κ΄€μ°°ν•˜κ±°λ‚˜ μ΅œμ†Œν•œ λΆ€ν˜Έ λΉ„νŠΈλ₯Ό κ΄€μ°°ν•  수 없도둝 ν•˜λŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

IMO NaN 비결정둠은 μ†Œν”„νŠΈμ›¨μ–΄κ°€ 이λ₯Ό μ‹ κ²½ μ“°λŠ” κ²½μš°κ°€ 맀우 λ“œλ¬ΌκΈ° λ•Œλ¬Έμ— κ·ΈλŒ€λ‘œ 두어야 ν•©λ‹ˆλ‹€. μ„±λŠ₯을 κ²°μ •μ μœΌλ‘œ λ§Œλ“€κΈ° μœ„ν•΄ ν¬μƒν•˜λŠ” κ²½μš°λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ?

λ‹€μŒμ€ NaN λΉ„νŠΈλ₯Ό κ΄€μ°°ν•  수 μžˆλŠ” λ°©λ²•μ˜ λͺ©λ‘μž…λ‹ˆλ‹€.

  • reinterpret μ „ν™˜
  • store λ₯Ό μ„ ν˜• λ©”λͺ¨λ¦¬μ— μ €μž₯ν•˜κ³  λ‹€λ₯Έ ν•΄μ„μœΌλ‘œ λΉ„νŠΈλ₯Ό λ‘œλ“œν•©λ‹ˆλ‹€(λ˜λŠ” μ™ΈλΆ€μ—μ„œ λΉ„νŠΈλ₯Ό κ΄€μ°°ν•˜λ„λ‘ 함).
  • κ°€μ Έμ˜¨ ν•¨μˆ˜μ˜ call 에 인수λ₯Ό μ „λ‹¬ν•˜κ±°λ‚˜ 내보낸 ν•¨μˆ˜μ—μ„œ 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • copysign λΉ„ NaN에 λŒ€ν•œ λΆ€ν˜Έ λΉ„νŠΈ

VM은 이듀 각각 μ•žμ— μ •κ·œν™” μ½”λ“œλ₯Ό μ‚½μž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그것이 μœ„μ—μ„œ λ…Όμ˜ν•œ "μ΄μŠ€μΌ€μ΄ν”„ ν¬μΈνŠΈμ—μ„œ μ •κ·œν™”" μ•„μ΄λ””μ–΄μž…λ‹ˆλ‹€. store λŠ” ν•« κ²½λ‘œμ—μ„œ 맀우 μΌλ°˜μ μ΄λ―€λ‘œ μ—¬μ „νžˆ μƒλ‹Ήνžˆ λΉ„μŒ‰λ‹ˆλ‹€.

@qwertie μ €λŠ” 그것듀에 λŒ€ν•΄ 맀우 관심을 κ°–κ³  μ—¬κΈ°μ—μ„œ λ…Όμ˜λœ κ²ƒμ²˜λŸΌ 사양에 ν¬ν•¨λ˜μ§€ μ•Šλ”λΌλ„ μ™„μ „νžˆ κ²°μ •μ μœΌλ‘œ λ§Œλ“œλŠ” 방법이 μžˆμŠ΅λ‹ˆλ‹€.

@qwertie μ΄μ μ—λŠ” μ•½κ°„ 더 큰 이식성(예: IEEE 754 totalOrder ν•¨μˆ˜λ₯Ό ν˜„λͺ…ν•˜μ§€ μ•Šκ²Œ μ‚¬μš©ν•˜λŠ” μ½”λ“œκ°€ 세상에 μ‘΄μž¬ν•¨), μ•½κ°„ 더 높은 μž¬ν˜„μ„±, μ—¬λŸ¬ λ…Έλ“œμ—μ„œ λŒ€μΉ­ 계산을 μˆ˜ν–‰ν•  λ•Œ 더 κ°•ν•œ λΆˆλ³€μ„±μ΄ 포함될 수 μžˆμŠ΅λ‹ˆλ‹€.

store λŠ” ν•« κ²½λ‘œμ—μ„œ 맀우 μΌλ°˜μ μ΄λ―€λ‘œ μ—¬μ „νžˆ μƒλ‹Ήνžˆ λΉ„μŒ‰λ‹ˆλ‹€.

이 경우 항상 λΆ€ν˜Έ 값을 지정할 수 μžˆμŠ΅λ‹ˆκΉŒ? κ·Έλž˜μ„œ mem에 배치되면 1둜 λ§Œλ“œμ‹œκ² μŠ΅λ‹ˆκΉŒ?

@wanderer 이것이 본질적으둜 μ •κ·œν™”κ°€ μˆ˜λ°˜λ˜λŠ” κ²ƒμž…λ‹ˆλ‹€. 값이 NaN인지 ν™•μΈν•˜κ³ , κ·Έλ ‡λ‹€λ©΄ μ•½κ°„μ˜ μˆ˜μ •μ„ μ μš©ν•©λ‹ˆλ‹€. 일반적으둜 ν•« 경둜의 μΆ”κ°€ 비ꡐ 및 β€‹β€‹λΆ„κΈ°μž…λ‹ˆλ‹€.

λ˜ν•œ 이 λ¬Έμ œμ—μ„œ μ–ΈκΈ‰ν•œ μ˜΅μ…˜μ„ λ²€μΉ˜λ§ˆν‚Ήν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. 여기에 μΆ”κ°€ν•  수 μžˆλŠ” λͺ¨λ“  λ²€μΉ˜λ§ˆν‚Ήμ„ ν™˜μ˜ν•©λ‹ˆλ‹€.

λ‚˜λŠ” μ„±λŠ₯을 μ„ ν˜Έν•˜λŠ” ν˜„μž¬ μˆ˜μ€€μ˜ 비결정둠에 κ°•ν•˜κ²Œ 기댈 κ²ƒμž…λ‹ˆλ‹€.
λ‚˜λŠ” μ‹€μ œλ‘œ wasκ°€ NaN의 κ°€μˆ˜ λΉ„νŠΈλ₯Ό μ—„κ²©ν•˜κ²Œ μ •μ˜ν•œλ‹€λŠ” 사싀에 λ‹€μ†Œ λ†€λžμŠ΅λ‹ˆλ‹€.
이것이 μ˜€λŠ˜λ‚ μ˜ ν”„λ‘œμ„Έμ„œμ— μΆ©λΆ„ν•  수 μžˆμ§€λ§Œ 미래의 ν”„λ‘œμ„Έμ„œκ°€ 무엇인지 λˆ„κ°€ μ•Œ 수 μžˆμŠ΅λ‹ˆκΉŒ?

wasm이 κ³ κΈ‰ μ–Έμ–΄μ—μ„œ μƒμ„±λ˜λŠ” 경우 ν•΄λ‹Ή λ²ˆμ—­κΈ°λŠ” 예λ₯Ό λ“€μ–΄ -ffast-math와 μœ μ‚¬ν•œ FP 의미 μ²΄κ³„μ˜ μˆ˜μ€€μ„ μ œμ–΄ν•˜λŠ” β€‹β€‹μ˜΅μ…˜μ„ μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그런 λ‹€μŒ λ²ˆμ—­κ°€λŠ” nan을 μ›ν•˜λŠ” ν˜•μ‹μœΌλ‘œ κ°•μ œ λ³€ν™˜ν•˜λŠ” 데 ν•„μš”ν•œ μΆ”κ°€ wasm μˆ˜μ •μ„ μ‚½μž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·Έ λͺ©μ μ„ μœ„ν•΄ μš°λ¦¬λŠ” isNan λ˜λŠ” normalizeNan μ—°μ‚°μžλ₯Ό μ œκ³΅ν•  수 μžˆμ§€λ§Œ, μ§€κΈˆμ€ 이것을 μ˜Ήν˜Έν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μš”μ»¨λŒ€, 이것을 "μˆ˜μ •"ν•˜λŠ” 것은 더 높은 μˆ˜μ€€μ˜ 도ꡬ인 IMO에 λ§‘κΈ°λŠ” 것이 κ°€μž₯ μ’‹μŠ΅λ‹ˆλ‹€.

+1 @mbodart. νŽΈμ§‘ : 였, μ‹€μ œλ‘œ +1 물건이 μžˆμŠ΅λ‹ˆλ‹€. :). Btw, λ‚˜λŠ” 개인적으둜 Wasm = 세계 지배라고 μƒκ°ν•˜λ©° λ”°λΌμ„œ 미래의 ν”„λ‘œμ„Έμ„œλŠ” 그것을 μ λŒ€μ‹œν•˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€.

결정을 내리기 전에 μ΄κ²ƒμ˜ μ„±λŠ₯ 효과λ₯Ό μ •λŸ‰ν™”ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 우리의 툴체인이 ν˜„μž¬λ‘œμ„œλŠ” 쒋은 μ„±λŠ₯ 츑정을 ν•˜κΈ°μ—λŠ” 아직 λ―Έμ„±μˆ™ν•˜λ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. λ‹€λ₯Έ 말둜 ν•˜μžλ©΄, λ‚˜λŠ” "μ²œμžκ΅­μ— μ˜ν•œ 죽음"을 ν”Όν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

@jfbastien에 λ™μ˜ν•©λ‹ˆλ‹€. μ˜λ―Έλ‘ μ„ μˆ˜μ •ν•˜κΈ° 전에 μ„±λŠ₯ 효과λ₯Ό λ¨Όμ € μˆ˜λŸ‰ν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λΆ„λͺ…νžˆ λ§μ”€λ“œλ¦¬μžλ©΄, μ €λŠ” ν˜„μž¬ μ—¬κΈ°μ—μ„œ λ³€ν™”λ₯Ό μ˜Ήν˜Έν•˜λŠ” 것이 μ•„λ‹™λ‹ˆλ‹€. 근거자료λ₯Ό μˆ˜μ§‘ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. NaN λΉ„νŠΈ 비결정둠이 νŠ€μ–΄λ‚˜μ™€ μ„€λͺ…을 μ›ν•©λ‹ˆλ‹€. 그리고 λ‚΄κ°€ μ•„λŠ” ν•œ 아무도 μ΄λŸ¬ν•œ λΉ„νŠΈλ₯Ό λΉ„κ²°μ •μ μœΌλ‘œ λ§Œλ“œλŠ” μ„±λŠ₯ 효과λ₯Ό μ •λŸ‰ν™”ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

ARMv8은 두 ν”Όμ—°μ‚°μžκ°€ λͺ¨λ‘ NaN인 경우 첫 번째 ν”Όμ—°μ‚°μžλ₯Ό 항상 μ „νŒŒν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€. κ·œμΉ™μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • ν•œ ν”Όμ—°μ‚°μžκ°€ μ‘°μš©ν•œ NaN이고 λ‹€λ₯Έ ν”Όμ—°μ‚°μžκ°€ μ‹ ν˜Έ NaN이면 μ‹ ν˜Έ NaN을 μ „νŒŒν•©λ‹ˆλ‹€.
  • 그렇지 μ•ŠμœΌλ©΄ 첫 번째 ν”Όμ—°μ‚°μžλ₯Ό μ „νŒŒν•©λ‹ˆλ‹€.

사양을 μ½λŠ” λ™μ•ˆ 이것은 ARMv8의 Aarch32 및 Aarch64 λͺ¨λ“œ λͺ¨λ‘μ— μ μš©λ©λ‹ˆλ‹€.

이 λ™μž‘μ€ 두 경우 λͺ¨λ‘μ—μ„œ 첫 번째 ν”Όμ—°μ‚°μžλ₯Ό μ „νŒŒν•˜λŠ” SSE와 λ‹€λ¦…λ‹ˆλ‹€.

두 μ•„ν‚€ν…μ²˜ λͺ¨λ‘ μ „νŒŒν•˜κΈ° 전에 μ‘°μš©ν•œ λΉ„νŠΈλ₯Ό μ„€μ •ν•˜μ—¬ sNaN을 qNaN으둜 λ³€ν™˜ν•©λ‹ˆλ‹€.

@stoklund 쒋은 자리! ARM이 첫 번째 NaN을 μ„ νƒν•˜λŠ” 것은 두 번째 NaN이 μ‹ ν˜Έλ₯Ό λ³΄λ‚΄λŠ” κ²½μš°μ— λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것을 λ†“μ³€μŠ΅λ‹ˆλ‹€. μ΄λŠ” μœ„μ˜ 닀쀑 NaN 사둀에 λŒ€ν•΄ λ‚΄κ°€ μ œμ‹œν•œ μ „λž΅μ„ λ³΅μž‘ν•˜κ²Œ λ§Œλ“€ 수 μžˆμœΌλ―€λ‘œ κ·Όκ±°μ—μ„œ 이λ₯Ό μ–ΈκΈ‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이제 μœ„μ˜ λ‚΄μš©μ„ μš”μ•½ν•œ νŠΉμ • ν…μŠ€νŠΈλ₯Ό μ œμ•ˆν•˜κΈ° μœ„ν•΄ #973을 λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰