Brief testing says this might be correct.
select to_char(sysdate - sysdate, '.99999999999999') from dual; was 0 all the way out.
Also:
SQL> select cast(sysdate as timestamp),cast(sysdate as timestamp) from dual;\n\nCAST(SYSDATEASTIMESTAMP)\n---------------------------------------------------------------------------\nCAST(SYSDATEASTIMESTAMP)\n---------------------------------------------------------------------------\n05-AUG-04 12.00.51.000000 AM\n05-AUG-04 12.00.51.000000 AM
Not exactly a rigorous test, but...
I do believe that multiple calls to sysdate in a pl/sql function will return different values, however. It's certainly a performance drag.