2015-12-23 15 views
7

Tôi đang làm việc thông qua các sân chơi cơ bản đầu tiên trong https://github.com/nettlep/learn-swift sử dụng XCodeký hiệu dấu chấm với p cho literals số thập lục phân trong nhanh chóng

Chính xác những gì đang xảy ra với biểu hiện này?

0xC.3p0 == 12.1875 

tôi đã học được về chữ thập lục phân và "p" ký hiệu đặc biệt mà chỉ ra một sức mạnh của 2.

0xF == 15 

0xFp0 == 15 // 15 * 2^0 

Nếu tôi cố gắng 0xC.3 tôi nhận được lỗi: dấu chấm động thập lục phân đen phải kết thúc với số mũ.

Tôi tìm thấy điều này đẹp overview of numeric literalsanother deep explanation, nhưng tôi không thấy điều gì đó giải thích những gì .3p0 thực hiện.

Tôi đã chia nhỏ mã và nâng cấp bài học này lên XCode 7/Swift 2 - đây là specific line.

Trả lời

5

Đây là Hexadecimal exponential notation.

By convention, the letter P (or p, for "power") represents times two raised to the power of ... The number after the P is decimal and represents the binary exponent.

...

Example: 1.3DEp42 represents hex(1.3DE) × dec(2^42).

Ví dụ, chúng tôi nhận được:

0xC.3p0 represents 0xC.3 * 2^0 = 0xC.3 * 1 = hex(C.3) = 12.1875 

where hex(C.3) = dec(12.{3/16}) = dec(12.1875) 

Ví dụ, bạn có thể thử 0xC.3p1 (bằng hex(C.3) * dec(2^1)), trong đó sản lượng gấp đôi giá trị, ví dụ: 24.375.

Bạn cũng có thể nghiên cứu sự phát triển mũ nhị phân trong một sân chơi cho hex-giá trị 1:

// ... 
print(0x1p-3) // 1/8 (0.125) 
print(0x1p-2) // 1/4 (0.25) 
print(0x1p-1) // 1/2 (0.5) 
print(0x1p1) // 2.0 
print(0x1p2) // 4.0 
print(0x1p3) // 8.0 
// ... 

Cuối cùng, điều này cũng được giải thích trong Apple`s Language Reference - Lexical Types: Floating-Point Literals:

Hexadecimal floating-point literals consist of a 0x prefix, followed by an optional hexadecimal fraction, followed by a hexadecimal exponent. The hexadecimal fraction consists of a decimal point followed by a sequence of hexadecimal digits. The exponent consists of an upper- or lowercase p prefix followed by a sequence of decimal digits that indicates what power of 2 the value preceding the p is multiplied by. For example, 0xFp2 represents 15 x 2^2, which evaluates to 60. Similarly, 0xFp-2 represents 15 x 2^-2, which evaluates to 3.75.

+0

cảm ơn cho chi tiết giải trình. Thứ đã ném tôi ra là 0xC.3 không được phép, điều đó làm tôi phân tâm khi nhận ra nó là một phần thập lục phân. Với ngữ pháp trong tài liệu tham khảo của Apple, có vẻ như lỗi đó có thể là một lỗi? – Ultrasaurus

+0

@Ultrasaurus Bạn được chào đón. Tôi có thể thấy điều đó đã ném bạn ra sao, nó có thể hơi lạ nếu bạn đi ngang qua với các số thập lục phân nhưng không, đặc biệt là hex. ký hiệu mũ. Tôi muốn nói rằng lỗi là hành vi mong đợi, vì tài liệu (ở trên) nêu rõ * "... bao gồm tiền tố 0x, tiếp theo là phần thập lục phân tùy chọn, theo sau là số mũ thập lục phân." *; tức là, số mũ hệ thập lục phân cần phải có mặt cho một chữ cái dấu phẩy động hoàn chỉnh theo định dạng thập lục phân. ... dfri

+0

... Từ tài liệu, tìm kiếm * "dấu phẩy động" * dưới * "Ngữ pháp của dấu phẩy động" *: nếu chúng ta muốn sử dụng ký hiệu thập lục phân, dấu phẩy động phải được trình bày trên biểu mẫu * hexadecimal-literal Tùy chọn (hệ thập lục phân phân số thập lục phân) số mũ *. Sau đó, * hex-exp *, là bắt buộc đối với biểu diễn này; do đó loại trừ nó sẽ dẫn đến lỗi thời gian biên dịch. – dfri

Các vấn đề liên quan