สามารถใช้ตัวดำเนินการทางคณิตศาสตร์ *, /, +, -, ^ เพื่อแปลงจำนวนที่ไม่ใช่ศูนย์เป็น 1 ได้หรือไม่


118

ฉันกำลังทำงานร่วมกับซอฟแวร์ (Oracle Siebel) ที่รองรับเฉพาะการแสดงออก JavaScript กับผู้ประกอบการคูณหารลบเพิ่มและแฮคเกอร์ ( *, /, -, +, ^) ฉันไม่มีตัวดำเนินการอื่น ๆ เช่น!หรือ? :ว่าง

การใช้ตัวดำเนินการข้างต้นเป็นไปได้ไหมที่จะแปลงตัวเลขเป็น 1 ถ้าไม่ใช่ศูนย์และปล่อยให้เป็น 0 ถ้ามันเป็นศูนย์อยู่แล้ว จำนวนอาจเป็นบวกศูนย์หรือลบ

ตัวอย่าง:

var c = 55;

var d;  // d needs to set as 1

ฉันลองc / cแล้ว แต่มันประเมินว่าNaNเมื่อใดที่cเป็น 0 dต้องเป็น 0 เมื่อcเป็น 0

c คือค่าสกุลเงินและจะมีตัวเลขต่อท้ายสูงสุดสองหลักและตัวเลขนำหน้า 12 หลัก

ฉันพยายามเลียนแบบifเงื่อนไขโดยการแปลงตัวเลขเป็นบูลีน 0 หรือ 1 จากนั้นคูณส่วนอื่น ๆ ของนิพจน์


3
ความคิดเห็นไม่ได้มีไว้สำหรับการอภิปรายเพิ่มเติม การสนทนานี้ได้รับการย้ายไปแชท
Samuel Liew

10
@SamuelLiew แม้ว่าจะมีจำนวนมากที่มีความเห็นและบางส่วนของพวกเขาควรจะออก ( การสนทนา , คำตอบในความคิดเห็น ) ส่วนใหญ่ของพวกเขามีการร้องขอสำหรับการชี้แจงจริงๆ ( ตัวอย่าง ) ความคิดเห็นที่ถามว่าปัญหา XYเป็นเส้นเขตแดนหรือไม่
user202729

Oracle Siebel Numeric Operators ดูเหมือนจะเป็น Exponent: docs.oracle.com/cd/E95904_01/books/VBLANG/…
Derrick Moeller

2
@DerrickMoeller ดูเหมือนว่าจะมีความแตกต่างระหว่าง Siebel VB และ Siebel eScript ในระยะหลังก็เป็น xor ฉันไม่แน่ใจว่าข้อใดใช้สองข้อนี้
CRice

3
@ user202729 เมื่อเธรดความคิดเห็นทั้งหมดยาวเกินไปเราจะไม่ปฏิบัติต่อความคิดเห็นที่แตกต่างกันออกไปเนื่องจากอินเทอร์เฟซ mod ที่สร้างโดยผู้ดูแลระบบ / ผู้พัฒนา SE ต้องการให้การดำเนินการเริ่มต้นของเราเป็น "ย้ายไปแชท" หรือ "ลบทั้งหมด" หากความคิดเห็นใดเป็นประโยชน์ควรแก้ไขเป็นคำถามเองหรือโพสต์เป็นคำตอบ หากความคิดเห็นใด ๆ ไม่ตรงประเด็นความคิดเห็นเหล่านี้ควรถูกตัด / ลบด้วยตนเอง หากคุณต้องการพูดคุยเกี่ยวกับ "คุณลักษณะ" ของม็อดนี้และ / หรือ "ความคิดเห็นมากเกินไป" ที่โมเดอเรเตอร์ติดธงอัตโนมัติได้รับโปรดนำขึ้นมาเพื่ออภิปรายเกี่ยวกับ Meta หรือ Meta.SE ขอบคุณ.
Samuel Liew

คำตอบ:


149

c / (c + 5e-324)ควรทำงาน. (ค่าคงที่5e-324คือNumber.MIN_VALUEจำนวนบวกที่น้อยที่สุดที่แสดงได้) ถ้า x เป็น 0 นั่นคือ 0 และถ้า x ไม่ใช่ศูนย์ (ในทางเทคนิคถ้า x มีค่าอย่างน้อย 4.45014771701440252e-308 ซึ่งเป็นจำนวนที่ไม่ใช่ศูนย์ที่น้อยที่สุดที่อนุญาตใน คำถาม 0.01 คือ) คณิตศาสตร์ทศนิยมของ JavaScript ไม่ชัดเจนเกินไปสำหรับคำตอบที่แตกต่างจาก 1 ดังนั้นมันจะออกมาเป็น 1


1
คุณต้องแปลงนิพจน์เป็นบูลก่อนเนื่องจาก OP พยายามคูณ 0 และ 1 ด้วยother parts of the expressionและc / (c + 5e-324) * some_expressionไม่ทำงาน
phuclv

28
นำจุดบกพร่องและทำให้มันกลายเป็นคุณลักษณะที่นั่น
Chirag Bhatia - chirag64

1
@Medinoc ใช่ แต่คำถามก็บอกด้วยว่าจะไม่มีตัวเลขเกิน 2 หลักหลังจุดทศนิยมและ 324 มากกว่า 2 มาก
Joseph Sible-Reinstate Monica

1
มันน่าสนใจและอาจใช้ได้กับ OP แต่ฉันไม่อยากเจอรหัสแบบนี้เมื่อทำงานในทีม อย่างน้อยที่สุดควรมีการบันทึกและทดสอบอย่างดี
Eric Duminil

1
@JosephSible ฉันรู้ แต่ถ้าคุณทำอย่างนั้นจริงๆคำตอบที่ชัดเจนที่สุดควรเป็นNumber(Boolean(n))ซึ่งไม่ใช้ตัวดำเนินการ ฉันไม่ได้บอกว่านี่ไม่ใช่คำตอบที่ OP กำลังมองหา แต่นี่ไม่ใช่คำตอบสำหรับคำถามที่ OP อธิบายไว้ น่าจะควรปรับปรุงคำถามว่า
user5532169

216

n/n^0ใช้การแสดงออก

ถ้าnไม่ใช่ศูนย์:

 Step    Explanation
------- -------------------------------------------------------------------------------
 n/n^0   Original expression.
 1^0     Any number divided by itself equals 1. Therefore n/n becomes 1.
 1       1 xor 0 equals 1.

ถ้าnเป็นศูนย์:

 Step    Explanation
------- -------------------------------------------------------------------------------
 n/n^0   Original expression.
 0/0^0   Since n is 0, n/n is 0/0.
 NaN^0   Zero divided by zero is mathematically undefined. Therefore 0/0 becomes NaN.
 0^0     In JavaScript, before any bitwise operation occurs, both operands are normalized.
         This means NaN becomes 0.
 0       0 xor 0 equals 0.

อย่างที่คุณเห็นค่าที่ไม่ใช่ศูนย์ทั้งหมดจะถูกแปลงเป็น 1 และ 0 จะอยู่ที่ 0 ซึ่งใช้ประโยชน์จากข้อเท็จจริงที่ว่าใน JavaScript NaN^0คือ 0

การสาธิต:

[0, 1, 19575, -1].forEach(n => console.log(`${n} becomes ${n/n^0}.`))


45
TIL: Number.NaN ^ n === no_O ( nเลขที่ จำกัด อยู่ที่ไหน)
zerkms

17
ดูเหมือนว่าเมื่อใช้เป็นตัวถูกดำเนินการแบบบิตNaNจะถูกแปลงเป็นศูนย์อย่างสะดวก ดู: การดำเนินการ Bitwise กับตัวเลขที่ไม่ใช่
CRice

3
@zerkms อาจจะ~~NaN === 0ดูเป็นธรรมชาติมากขึ้น
Bergi

8
@EnricoBorba ไม่ใช่การยกกำลัง (ซึ่งใช้**) แต่เป็น XOR แบบบิต การดำเนินการ Bitwise มีลำดับความสำคัญต่ำมากใน javascript ดังนั้นการแบ่งจะเกิดขึ้นก่อน
CRice

3
^เป็นตัวดำเนินการ xor แบบบิต ฉันสงสัยว่า^ใน OP เป็นบิต xor หรือไม่เมื่อตัวดำเนินการอื่น ๆ ทั้งหมดเป็นตัวดำเนินการทางคณิตศาสตร์ อาจเป็นตัวดำเนินการเลขชี้กำลัง ( **ใน JavaScript)
Salman A

17

(((c/c)^c) - c) * (((c/c)^c) - c) จะคืนค่า 1 เป็นค่าลบและค่าบวกและ 0 สำหรับ 0 เสมอ

เป็นเรื่องที่น่าสับสนกว่าคำตอบที่เลือกและอีกต่อไป อย่างไรก็ตามฉันรู้สึกว่ามันแฮ็คน้อยกว่าและไม่ต้องอาศัยค่าคงที่

แก้ไข: ตามที่ @JosephSible กล่าวถึงรุ่นที่กะทัดรัดกว่าของฉันและเวอร์ชันของ @ CRice ที่ไม่ใช้ค่าคงที่คือ:

c/c^c-c

ไม่ได้เลือกคำตอบของ CRice โจเซฟซิเบิลคือ ด้วยความสัตย์จริงฉันไม่ได้สังเกตเห็นคำตอบของ CRice จนกระทั่งหลังจากโพสต์
Kyle Wardle

2
แม้ว่าจะไม่ใช้ค่าคงที่มีเพียงตัวดำเนินการและตัวแปรที่กำหนด
L3viathan

2
@JosephSible c/c^(c-c)เป็นเพียงc
Tavian Barnes

2
@JosephSible ฉันอ่าน^เป็นเลขชี้กำลังตามนัยโดย OP "คูณหารลบบวกและเลขชี้กำลัง (*, /, -, +, ^ )" ถ้า^XOR มีลำดับความสำคัญของ JavaScript แสดงว่าฉันคิดผิด ฉันขอความกระจ่างเกี่ยวกับ OP
Tavian Barnes

2
@TavianBarnes นั่นไม่ใช่สิ่งที่ OP เขียน; มีคนแก้ไขคำถาม ฉันคืนค่าเป็นวิธีที่ OP ถามจริง
Joseph Sible-Reinstate Monica

2

คำตอบที่ซับซ้อนมาก แต่คำตอบที่ไม่ได้ขึ้นอยู่กับความแม่นยำที่ จำกัด : หากคุณรับx^(2**n)มันจะเท่ากับx+2**nว่า x เป็นศูนย์เสมอ แต่จะเท่ากับx-2**nว่า x มีหนึ่งในอันดับที่ n ดังนั้นสำหรับ x = 0 (x^(2**n)-x+2**n)/(2**(n+1)จะเป็น 1 เสมอ แต่บางครั้งมันจะเป็นศูนย์สำหรับ x! = 0 ดังนั้นถ้าคุณหาผลคูณของ(x^(2**n)-x+2**n)/(2**(n+1)n ทั้งหมดแล้ว XOR ด้วย 1 คุณจะได้ฟังก์ชันที่ต้องการ คุณจะต้องเขียนรหัสแต่ละปัจจัยด้วยตนเอง และคุณจะต้องแก้ไขสิ่งนี้หากคุณใช้คะแนนลอย

หากคุณมีตัว==ดำเนินการก็ใช้(x==0)^1งานได้


3
ทั้ง**มิได้==ใช้ได้
Joseph Sible-Reinstate Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.