2010-10-22 29 views
5

Tôi đang cố gắng mô phỏng trình tạo báo cáo khung chính (không còn tồn tại) trong môi trường Access 2003 hoặc Access 2010. Dữ liệu mà nó tạo ra phải khớp chính xác với báo cáo bằng giấy từ đầu những năm 70. Thật không may, các dữ liệu năm đầu tiên được chạy trên phần cứng sử dụng biểu diễn điểm nổi của IBM thay vì IEEE. Với sự trợ giúp của Google, tôi đã tìm thấy một thư viện các hàm VBA sẽ chuyển đổi một phao từ thập phân sang định dạng nhị phân IEEE 754 32bit. Tôi đã phải sửa đổi thư viện để chấp nhận 32 bit hoặc 64 bit nổi, vì vậy tôi có kiến ​​thức làm việc khiêm tốn về định dạng điểm nổi, tuy nhiên, tôi gặp sự cố khi thực hiện chuyển đổi từ định dạng nhị phân IEEE sang IBM, cũng như gặp rắc rối nhân và thêm số IBM hoặc số IEEE.Giả lập phép nhân/điểm bổ sung dấu chấm động của IBM trong VBA

Tôi chưa bật lên bất kỳ thư viện nào khác để thực hiện phép chuyển đổi và phép tính số học trong VBA - có cách nào dễ dàng hơn để thực hiện việc này hoặc thư viện hiện có mà tôi không tìm thấy không? Không, giải thích rõ ràng và đơn giản về các thuật toán liên quan?

Xin cảm ơn trước.

+0

Bạn có chắc chắn báo cáo trên IBM đã sử dụng dấu phẩy động không? Hầu hết những thứ đó đều sử dụng BCD. – Gabe

+0

Tôi không chắc chắn 100% - quyết định này dựa trên đồng nghiệp nhớ một lập trình viên máy tính lớn giải thích cách đây nhiều năm rằng lý do chúng tôi không thể khớp với dữ liệu cũ hơn là do "thay đổi cách trình biên dịch xử lý số thập phân" tài liệu hướng dẫn rằng SAS đã thêm hỗ trợ cho điểm nổi IEEE cùng với điểm nổi của IBM một vài năm trước khi chúng ta ngừng nhìn thấy những mâu thuẫn. –

+0

Định dạng BCD không phải là định dạng dấu chấm động Hoặc không phải trong thế giới máy tính mini S/34 của IBM, S/36 và S/38 vào cuối những năm 70 và 80. http://en.wikipedia.org/wiki/Binary-coded_decimal –

Trả lời

1

Vấn đề ở đây là bạn đang nhầm lẫn về vấn đề loại thập phân trong quyền truy cập và giá trị của các giá trị dấu phẩy động đơn và đôi có sẵn trong truy cập.

Nếu bạn sử dụng loại dữ liệu tiền tệ trong truy cập, đây là số nguyên được chia tỷ lệ và sẽ không tạo số làm tròn (đó là điều mà hầu hết chúng ta sử dụng để tính toán và báo cáo tài chính). Bạn cũng có thể sử dụng các giá trị thập phân trong truy cập, và một lần nữa chúng không làm tròn chút nào vì chúng là các số thập phân được đóng gói.

Tuy nhiên, cả giá trị đơn và đôi có sẵn bên trong quyền truy cập thực tế là định dạng tương tự và tuân theo tiêu chuẩn điểm nổi IEEE.

Đối với một biến truy cập duy nhất, đây là một số 32bit, và phạm vi là:

-3.402823E38 
    to 
-1.401298E-45 for negative values 

1.401298E-45 
    to 
3.402823E38 for positive values 

Đó có vẻ như là tương tự với tôi như là tiêu chuẩn IEEE 754.

Vì vậy, nếu bạn thêm giá trị vào quyền truy cập dưới dạng duy nhất, bạn sẽ nhận được kết quả tương tự.

Vì vậy, Intel dựa trên, và truy cập đơn và đôi tôi tin là giống như tiêu chuẩn IEEE này.

Vấn đề thực sự duy nhất ở đây là định dạng dữ liệu gốc bạn truy cập và loại văn bản hoặc chuỗi hoặc quy trình chuyển đổi nào xảy ra khi dữ liệu đó được kéo vào và lưu trữ?

Truy cập có thể chuyển đổi số. Hãy thử gõ các giá trị tại dấu nhắc dòng lệnh truy cập (debug cửa sổ)

? hex(255) 
    Above will show FF 

? csng(&hFF) 
    Above will show 255 

Edit:

Ah, ok, tôi thấy bây giờ tôi có điều này đảo ngược, sai của tôi ở đây. Vấn đề ở đây là giả sử bạn chuyển đổi một số sang định dạng cũ hơn của IBM (quá 64) ?, bạn sẽ THEN phải có được bàn tay của bạn trên mã của họ mà họ sử dụng để thêm những con số đó. Trong thực tế, ngay cả khi đó, các mô hình IBM khác nhau tùy thuộc vào những gì bạn mua thực sự tạo ra các kết quả khác nhau (nhiều tiền hơn = chính xác hơn).

Vì vậy, bạn không chỉ cần các quy trình chuyển đổi để chuyển đổi thành biểu diễn bên trong, bạn THEN cần các thủ tục cộng/trừ/nhân các số đó. Vì vậy, chỉ có thói quen chuyển đổi sẽ không giúp bạn đạt được rất nhiều, vì bạn cũng phải lặp lại các thói quen chính xác của họ mà làm toán. Những loại thói quen đó có thể không được tạo ra bằng nhau về cách chúng làm tròn số vv.

+0

Tôi không nghĩ rằng đó là trường hợp mà tôi đang bối rối về đĩa đơn/tăng gấp đôi trong Access. Tôi biết rằng cả hai đều có cùng định dạng. Vấn đề là tôi cần phải phù hợp với các con số được tạo ra bởi một hệ thống đã làm * không * sử dụng định dạng IEEE 754. Các số đi vào Access là định dạng văn bản điểm cố định (ví dụ 123.456, luôn có 3 chữ số thập phân). Khó khăn là có các phép tính nhân ba trong số các số # này và sau đó thêm hàng nghìn chúng lại với nhau - tôi cần mô phỏng các lỗi chính xác xảy ra trên phần cứng/phần mềm gốc. –

+0

Ah, vâng, tôi đã đọc sai. Xem chỉnh sửa của tôi + nhận xét thêm ở đây. Tôi nghĩ việc chuyển đổi sang định dạng của IBM có thể không quá khó, nhưng đó chỉ là một phần nhỏ của vấn đề. Việc tìm ra độ chính xác nội bộ rất dễ dàng, nhưng tìm ra cách thức các quy trình toán học hoạt động như thế nào và cách chúng xử lý làm tròn sẽ là một việc tốt khó khăn hơn ở đây. –

2

Thành thật mà nói, bạn nên bắt đầu bằng cách xem bộ mô phỏng Hercules. http://www.hercules-390.org/ Khác với lý thuyết với VBA, bạn có thể sử dụng kiểu Thập phân để có kết quả tốt (lưu ý bạn phải CDec để tạo các kết quả này) nó sử dụng 12 bit với công suất biến là mười vô hướng.

Một google nhanh chóng cho thấy this post từ nhóm hercules, trong đó khẳng định Alberts điểm về việc cần phải biết phần cứng:

--- Snip--

Về lý thuyết, mà là ít như vậy trong thực tế. S/360 và S/370 có một sự lựa chọn của các bộ hướng dẫn khoa học hoặc thương mại. Trước đây, thêm hướng dẫn FP và đăng ký vào cơ sở; số thập phân theo các số thập phân hướng dẫn, bao gồm Chỉnh sửa và Chỉnh sửa & Đánh dấu. Nhưng lớn hơn 360 (iirc/65 trở lên) và 370 (/ 155 và lên) mô hình có sự kết hợp của hai, được gọi là tập lệnh Universal, và tại một số điểm, S/370 đã giảm tùy chọn .

--- snip ---

Tôi phải nói rằng khi nhìn vào mã nguồn hercules có thể bạn sẽ cần phải tìm ra chính xác mã hoạt động điểm nổi (về độ chính xác duy nhất, dài, mở rộng) đang được thực hiện.

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