Số hợp lý trong Raku


8

Tôi đang sử dụng Raku cho một số tính toán, bởi vì nó có các kiểu số đẹp. Tuy nhiên, tôi gặp vấn đề với việc sử dụng '.raku'

say (1/6+1/6).raku
#<1/3>

Chúng tôi có được điều này. Tuy nhiên,

say (1/10+1/10).raku
#0.2

Có phải là một lỗi? Tôi dự kiến ​​<1/5>. Chuyện gì xảy ra


Đã xóa thẻ perl vì điều này không liên quan đến ngôn ngữ lập trình Perl.
ikegami

Câu trả lời:


11

Trong Raku, 0.2xây dựng a Rat, và do đó tạo ra kết quả rất giống với văn bản 1/5(sẽ được gấp lại liên tục) hoặc <1/5>(dạng chữ). Bạn chỉ nhận được dấu phẩy động trong trường hợp chỉ định số mũ (ví dụ 2e-1:).

Công việc của phương thức .raku(trước đây gọi là .perl) là tạo ra thứ gì đó sẽ làm tròn và tạo ra cùng một giá trị nếu EVAL'd. Trong trường hợp 1/5, điều đó có thể được biểu diễn chính xác dưới dạng thập phân, do đó nó sẽ tạo ra 0.2. Nó chỉ dùng đến biểu diễn phân số khi dạng thập phân sẽ không đi khứ hồi.

Bạn luôn có thể khôi phục tử số và mẫu số bằng cách sử dụng các phương thức .numerator.denominatorđịnh dạng theo ý muốn. Ngoài ra, .nudephương thức trả về một danh sách tử số và mẫu số mà người ta có thể tham gia với /nếu muốn:

say (1/6+1/6).nude.join("/");     # 1/3
say (1/10+1/10).nude.join("/");   # 1/5

.nudetên phương thức hài hước vô tình tốt nhất
user0721090601

1
Ai nói đó là vô ý?
Holli

1
@ user0721090601 Dựa trên cách mà Larry đã đề cập đến nó trong các cuộc phỏng vấn, tôi sẽ đặt cược vào việc đó là cố ý.
Brad Gilbert

@BradGilbert Tôi giả sử ai đó sẽ bật lên để nói rằng khi tôi đưa ra nhận xét :-)
user0721090601

1

Xin chào @ milou123 Tôi cũng hơi ngạc nhiên khi raku trở lại biểu diễn thập phân - tôi có thể thấy rằng một số bối cảnh - chẳng hạn như dạy số học phân số sẽ có lợi khi có chế độ "giữ như chuột". Phải nói rằng, cuối cùng cũng có ý nghĩa rằng chỉ có một cách để .raku một cái gì đó và số thập phân đó là đại diện mặc định.

Tất nhiên, với raku, bạn cũng có thể thay đổi ngôn ngữ một chút. Trong trường hợp này, tôi đã phát minh ra một toán tử hậu tố '→' mới ...

multi postfix:<→> ( Rat:D $r ) { $r.nude.join("/") }
say (1/5+1/5)→;    # 2/5

Tôi không đủ thông minh để tìm ra nếu phương pháp 'raku' tích hợp có thể bị ghi đè theo cách tương tự, sẽ rất muốn xem lời khuyên về cách thực hiện chính xác ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.